%\documentclass[twoside]{article}
%\usepackage{epsfig,html,amsmath,amssymb,lscape,longtable,pstricks,cite,hyperref}
%\usepackage{graphics}
%\pagestyle{headings}
%\markboth{}{}
%\newcommand{\hytt}[1]{\texttt{\hyphenchar\font=\defaulthyphenchar #1}}

% !Mode:: "TeX:UTF-8"
\documentclass[twoside]{article}
\usepackage{epsfig,html,amsmath,longtable,cite,hyperref}
\usepackage{geometry}
\usepackage{graphics}
\usepackage{graphicx}
\usepackage{color}
\usepackage{subfig}
\usepackage{indentfirst}
\usepackage{multicol}
\usepackage{listings}
\usepackage{lipsum}

\usepackage{xeCJK} % seperate the english and chinese

\setCJKmainfont[ItalicFont={AR PL UKai CN}]{AR PL UMing CN} %设置中文默认字体
%\XeTeXlinebreaklocale "zh"  % Auto linebreak for chinese
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt % Auto linebreak for chinese

\setlength{\parindent}{2em}

\begin{document}
	
%\linebreak {4}

	%{\kaishu 楷体}
	%{\heiti 黑体}
	%{\fangsong 仿宋}
	
	\title{AutoPDMS 容器设计\\软件产品设计规范书}
	\author{
	}
	\maketitle {}
	
	\begin{figure}[h]
		\centering
	%	\includegraphics[scale=0.6]{fullscreen.png}
		%\epsfig{file=processplant.jpg,width=12cm}
		%\caption{流程工厂\label{cover}}
	\end{figure}
	\thispagestyle{empty}%目录页不显示页码
	\newpage
	\setcounter{page}{1}%从下面开始编页码
%\begin{multicols}{2}
	\numberwithin{equation}{subsection}


\tableofcontents
\newpage


\section{前言} 
\subsection{修订历史}

作者	李国斌、张喆、董浩、谢新明	审核人	李国斌

完成时间	2019.06.22	审核时间	2019.06.23

版本修订历史记录：
编号	修订日期	修改内容描述和理由	修改作者	修改的页数

作者	张喆	审核人	李国斌

完成时间	2019.06.06	审核时间	2019.06.06

编号	修订日期	修改内容描述和理由	修改作者	修改的页数

1	2019.06.05		李国斌	

2	2019.06.05		张喆	

3	2019.06.05		董浩	

4	2019.06.06		谢新明	

5	2019.06.06		所有人	

本文将功能需求总结书(需求总结)和软件设计规范书(功能设计)合并在一起了。其中需求总结主要由张喆完成，董浩、李国斌补充了一些内容。27章功能设计由张喆完成，其他人补充了一些内容。

\part{Vessel}
\section{容器}
容器(Vessel)包括压力容器和常压容器。
\subsection{简史}
广义的看，各种崎岖不平的表面都可以因为万有引力作用而成为容器。因此容器的历史和宇宙一样古老。

公元前43000年智人走出非洲，对水源的需求无处不在。一只野生椰子的壳就是他们高贵的盛水容器了。

公元前10000年，人类开发了第一个人工容器-陶器，用于盛放各种固体、液体物质。

世界上第一台蒸汽机是由古希腊数学家亚历山大港的希罗（Hero of Alexandria）于公元1世纪发明的汽转球（Aeolipile），这是蒸汽机的雏形。它是一种压力容器。

约1679年法国物理学家丹尼斯·巴本在观察蒸汽逃离他的高压锅后制造了第一台蒸汽机的工作模型。同时代的萨缪尔·莫兰也提出了蒸汽机的主意。 [1]
  
1698年托马斯·塞维利和1712年托马斯·纽科门制造了早期的工业蒸汽机，他们对蒸汽机的发展都做出了自己的贡献。1807年罗伯特·富尔顿第一个成功地用蒸汽机来驱动轮船。瓦特运用科学理论，逐渐发现了这种蒸汽机的毛病所在。从1765年到1790年，他进行了一系列发明，比如分离式冷凝器、汽缸外设置绝热层、用油润滑活塞、行星式齿轮、平行运动连杆机构、离心式调速器、节气阀、压力计等等，使蒸汽机的效率提高到原来纽科门机的3倍多，最终发明出工业用蒸汽机。

16世纪末到17世纪后期，英国的采矿业，特别是煤矿，已发展到相当的规模，单靠人力、畜力已难以满足排除矿井地下水的要求，而现场又有丰富而廉价的煤作为燃料。现实的需要促使许多人，如英国的帕潘、萨弗里、纽科门等就致力于“以火力提水”的探索和试验。

最初的真空蒸汽机被用来将矿井里的水抽出来。纽科门的蒸汽机将蒸汽引入气缸后阀门被关闭，然后冷水被撒入汽缸，蒸汽凝结时造成真空。活塞另一面的空气压力推动活塞。在矿井中联结一根深入竖井的杆来驱动一个泵。蒸汽机活塞的运动通过这根杆传到泵的活塞来将水抽到井外。

第一个巨大的改善是将气缸与凝结缸通过一个阀门分开。瓦特在伯明翰发明了这个改进。这个改进提高了蒸汽机的效率。下一个改进是将阀门的操作自动化。

这些早期的真空蒸汽机的效率有限，但它们比较安全，因为它们的压力比较低，在物质发生损坏的情况下机器向内收缩，而不是向外爆炸。它们的效率受外部气压、气缸变形、燃烧和沸腾的效率和凝结能力的限制。理论最高效率受水在普通大气压下比较低的沸腾温度限制。

使用高温高压的蒸汽为蒸汽机的效率带来了巨大的提高。但这种蒸汽机比真空蒸汽机危险得多。锅炉和机器的爆炸造成了许多大事故。安全阀在这里带来了很大的改进，在压力过高的情况下安全阀放气减压。但真正保证安全只有依靠建造、运行和维护的经验和安全规则。

英国人萨弗里（Savery）制成世界上第一台实用的蒸汽提水机，在1698年取得标名为“矿工之友”的英国专利。他将一个蛋形容器先充满蒸汽，然后关闭进汽阀，在容器外喷淋冷水使容器内蒸汽冷凝而形成真空。打开进水阀，矿井底的水受大气压力作用经进水管吸入容器中；关闭进水阀，重开进汽阀，靠蒸汽压力将容器中的水经排水阀压出。待容器中的水被排空而充满蒸汽时，关闭进汽阀和排水阀，重新喷水使蒸汽冷凝。如此反复循环，用两个蛋形容器交替工作，可连续排水。

萨弗里的提水机依靠真空的吸力汲水，汲水深度不能超过六米。为了从几十米深的矿井汲水，须将提水机装在矿井深处，用较高的蒸汽压力才能将水压到地面上，这在当时无疑是困难而又危险的。

纽科门及其助手卡利在1705年发明了大气式蒸汽机，用以驱动独立的提水泵，被称为纽科门大气式蒸汽机。这种蒸汽机先在英国，后来在欧洲大陆得到迅速推广，它的改型产品直到19世纪初还在制造。纽科门大气式蒸汽机的热效率很低，这主要是由于蒸汽进入汽缸时，在刚被水冷却过的汽缸壁上冷凝而损失掉大量热量，只在煤价低廉的产煤区才得到推广。

1764年，英国的仪器修理工詹姆斯·瓦特为格拉斯哥大学修理纽可门蒸汽机模型时，注意到了这一缺点，并于1765年发明了设有与汽缸壁分开的凝汽器的蒸汽机，并于1769年取得了英国的专利。初期的瓦特蒸汽机仍用平衡杠杆和拉杆机构来驱动提水泵，为了从凝汽器中抽除凝结水和空气，瓦特装设了抽气泵。他还在汽缸外壁加装夹层，用蒸汽加热汽缸壁，以减少冷凝损失。

瓦特的创造性工作使蒸汽机迅速地发展，他使原来只能提水的机械，成为了可以普遍应用的蒸汽机，并使蒸汽机的热效率成倍提高，煤耗大大下降。为纪念瓦特的贡献，物理学中功率的单位名称以其姓氏命名。

自18世纪晚期起，蒸汽机不仅在采矿业中得到广泛应用，在冶炼、纺织、机器制造等行业中也都获得迅速推广。它使英国的纺织品产量在20多年内(从1766年到1789年)增长了5倍，为市场提供了大量消费商品，加速了资金的积累，并对运输业提出了迫切要求。

在船舶上采用蒸汽机作为推进动力的实验始于1776年,经过不断改进，至1807年，美国的富尔顿制成了第一艘实用的明轮推进的蒸汽机船“克莱蒙”号。此后，蒸汽机在船舶上作为推进动力历百余年之久。

1800年，英国的特里维西克设计了可安装在较大车体上的高压蒸汽机。1803年，他把它用来推动在一条环形轨道上开动的机车，找来喜欢新奇玩意儿的人乘坐，向他们收费，这就是机车的雏型。英国的史蒂芬孙将机车不断改进，于1829年创造了“火箭”号蒸汽机车，该机车拖带一节载有30位乘客的车厢，时速达46公里/时，引起了各国的重视，开创了铁路时代。

19世纪末，随着电力应用的兴起，蒸汽机曾一度作为电站中的主要动力机械。1900年，美国纽约曾有单机功率达五兆瓦的蒸汽机电站。

蒸汽机的发展在20世纪初达到了顶峰。它具有恒扭矩、可变速、可逆转、运行可靠、制造和维修方便等优点，因此曾被广泛用于电站、工厂、机车和船舶等各个领域中，特别在军舰上成了当时唯一的原动机。

蒸汽机的发明推动了压力容器的发展。

早期的化学工业，反应压力多在10兆帕以下。但合成氨和高压聚乙烯等高压生产工艺出现后，要求压力容器的压力达100兆帕以上。随着化工和石油化工等工业的发展，压力容器的工作温度范围越来越宽，容量不断增大，有些还要求耐介质腐蚀。20世纪60年代开始，核电站的发展对反应堆压力容器提出了更高的安全和技术要求，从而促进了压力容器的进一步发展，广泛应用于各工业部门。压力容器主要为圆柱形，也有球形或其他形状。根据结构形式，可分为多层式压力容器，绕板式压力容器、型槽绕带式压力容器、热套式压力容器、锻焊式压力容器和厚板卷焊式压力容器等。大多数压力容器由钢制成，也有的用铝、钛等有色金属和玻璃钢、预应力混凝土等非金属材料制成。压力容器在使用中如发生爆炸，会造成灾难性事故。为了使压力容器在确保安全的前提下达到设计先进、结构合理、易于制造、使用可靠和造价经济等目的，各国都根据本国具体情况制定了有关压力容器的标准、规范和技术条件，对压力容器的设计、制造、检验和使用等提出具体和必须遵守的规定。
\subsection{定义}
压力容器，英文：pressure vessel，是指盛装气体或者液体、固体，承载一定压力并对安全性有一定要求的密闭设备。

为了更有效地实施科学管理和安全监检，中国《压力容器安全监察规程》中根据工作压力、介质危害性及其在生产中的作用将压力容器分为三类。并对每个类别的压力容器在设计、制造过程，以及检验项目、内容和方式做出了不同的规定。压力容器已实施进口商品安全质量许可制度，未取得进口安全质量许可证书的商品不准进口。应该按照最新TSG21-2016《固定式压力容器安全技术监察规程》中划分，先按介质划分为第一组介质和第二组介质，然后再按照压力和容积划分类别Ⅰ类，Ⅱ类，Ⅲ类，老容规的所谓第一类、第二类、第三类已经不适用了。
\subsection{应用领域}
压力容器广泛应用于工业、民用、军工等许多部门以及科学研究的许多领域，其中以在化学工业与石油化学工业中使用最多，仅在石油化学工业中应用的压力容器就占全部压力容器总数的50 \%左右。压力容器在化工与石油化工领城,主要用于传热、传质、反应等工艺过程，以及贮存、运输有压力的气体或液化气体;在其他工业与民用领域亦有广泛的应用，如空气压缩机。各类专用压缩机及制冷压缩机的辅机(冷却器、缓冲器、油水分离器、贮气罐、蒸发器、液体冷却剂贮罐等)均属压力容器。
\subsection{制造工艺}
1、压力容器制造工序一般可以分为：原材料验收工序、划线工序、切割工序、除锈工序、机加工（含刨边等）工序、滚制工序、组对工序、焊接工序（产品焊接试板）、无损检测工序、开孔划线工序、总检工序、热处理工序、压力试验工序、防腐工序。

2、不同的焊接方法有不同的焊接工艺。焊接工艺主要根据被焊工件的材质、牌号、化学成分，焊件结构类型，焊接性能要求来确定。首先要确定焊接方法，如手弧焊、埋弧焊、钨极氩弧焊、熔化极气体保护焊等等，焊接方法的种类非常多，只能根据具体情况选择。确定焊接方法后，再制定焊接工艺参数，焊接工艺参数的种类各不相同，如手弧焊主要包括：焊条型号（或牌号）、直径、电流、电压、焊接电源种类、极性接法、焊接层数、道数、检验方法等等。
\subsection{行业发展}
（1）受到国家产业政策的鼓励 金属压力容器行业受到相关产业政策”所列的相关国家产业政策的鼓励，良好的产业政策环境有利于本行业未来的持续发展。

（2）装备制造业的升级是中国迈向制造业强国的必经之路 装备制造业的技术水平和实力，直接影响和决定着其下游产业和产品的竞争力，是国家综合国力的重要体现。纵观世界各工业强国，无一例外都是装备制造业的强国。受益于我国国民经济的持续快速发展和国家的大力扶持，我国由制造业大国向制造业强国转变已经成为必然趋势。 在我国工业装备升级的大背景下，金属压力容器的重要应用领域如清洁能源应用、新能源制造、海水淡化装备制造等被列入《当前优先发展的高技术产业化重点领域指南（2007年度）》和《产业结构调整指导目录（2005 年本）》，下游产业的升级换代必将为金属压力容器制造行业带来巨大的发展机遇和市场前景。

（3）装备制造业的发展重心正逐步向亚太地区转移
受经济全球化和人工成本不断增加的影响，世界制造业的重心正在逐步向亚太地区转移。美国ASME认证作为国际上接受和应用最为广泛的压力容器标准，受到我国越来越多的企业的学习和推广。根据中国化工装备协会的统计，2007年我国的ASME持证厂商为260家，较上年增长33\%；截至2009年6月，这一数量已增加至390家，位列全球第二。其中又以江苏省的持证企业数量最多为126家。我国制造业经过多年的发展，已具备了相当的规模和实力基础，为国外向我国转移装备制造业提供了现实的可能。

（4）在引进、吸收、消化、创新的基础上发展出适合我国国情的新技术、新工艺，培养了一大批技术骨干和经验丰富的管理者，具备了开拓国内外市场的核心竞争力。
\subsection{容器分类}
\subsubsection{分类概述}
压力容器的分类方法很多，从使用、制造和监检的角度分类，有以下几种。

\subsubsection{压力容器} 
(1)按承受压力的等级分为：低压容器、中压容器、高压容器和超高压容器。

(2)按盛装介质分为：非易燃、无毒；易燃或有毒；剧毒。

(3)按工艺过程中的作用不同分为：

①反应容器：用于完成介质的物理、化学反应的容器。
②换热容器：用于完成介质的热量交换的容器。
③分离容器：用于完成介质的质量交换、气体净化、固、液、气分离的容器。
④贮运容器：用于盛装液体或气体物料、贮运介质或对压力起平衡缓冲作用的容器。

\subsubsection{基本分类方法}

压力容器分类应当先按照介质特性，按照以下要求选择分类图，再根据设计压力p（单位MPa）和容积V（单位L），标出坐标点，确定容器类别：

(1)对于第一组介质，压力容器的分类见图A-1。

(2)对于第二组介质，压力容器的分类见图A-2。

图A-1 压力容器分类图—第一组介质
图A-2 压力容器分类图—第二组介质

\subsubsection{多腔压力分类}

多腔压力容器（如换热器的管程和壳程、夹套容器等）按照类别高的压力腔作为该容器的类别并且按该类别进行使用管理。但应当按照每个压力腔各自的类别分别提出设计、制造技术要求。对各压力腔进行类别划定时，设计压力取本压力腔的设计压力，容积取本压力腔的几何容积。

1．同腔多种介质容器分类

一个压力腔内有多种介质时，按组别高的介质分类。

2． 介质含量极小容器分类

当某一危害性物质在介质中含量极小时，应当按其危害程度及其含量综合考虑，由压力容器设计单位决定介质组别。

\subsubsection{特殊情况分类}

(1)坐标点位于图A-1或者图A-2的分类线上时，按较高的类别划分其类别。

(2)对于GB 5044和HG 20660两个标准中没有明确规定的介质，应当按化学性质、危害程度及其含量综合考虑，由压力容器设计单位决定介质组别。(3)本规程1.4条范围内的压力容器统一划分为第Ⅰ类压力容器。

\subsubsection{压力等级划分}

压力容器的设计压力（p）划分为低压、中压、高压和超高压四个压力等级：

(1)低压(代号L) 0.1MPa≤p<1.6MPa

(2)中压(代号M) 1.6MPa≤p<10.0MPa

(3)高压(代号H) 10.0MPa≤p<100.0MPa

(4)超高压(代号U) p≥100.0MPa。

\subsubsection{品种划分}

压力容器按在生产工艺过程中的作用原理，分为反应压力容器、换热压力容器、分离压力容器、储存压力容器。具体划分如下：
(1)反应压力容器（代号R）：主要是用于完成介质的物理、化学反应的压力容器，如反应器、反应釜、分解锅、硫化罐、分解塔、聚合釜、高压釜、超高压釜、合成塔、变换炉、蒸煮锅、蒸球、蒸压釜、煤气发生炉等。
(2)换热压力容器（代号E）：主要是用于完成介质的热量交换的压力容器，如管壳式余热锅炉、热交换器、冷却器、冷凝器、加热器、消毒锅、染色器、烘缸、蒸炒锅、预热锅、溶剂预热器、蒸锅、蒸脱机、电热蒸汽发生器、煤气发生炉水夹套等。
(3)分离压力容器（代号S）：主要是用于完成介质的流体压力平衡缓冲和气体净化分离的压力容器，如分离器、过滤器、集油器、缓冲器、洗涤器、吸收塔、铜洗塔、干燥塔、汽提塔、分汽缸、除氧器等。
(4)储存压力容器（代号C，其中球罐代号B）：主要是用于储存、盛装气体、液体、液化气体等介质的压力容器，如各种型式的储罐。
在一种压力容器中，如同时具备两个以上的工艺作用原理时，应当按工艺过程中的主要作用来划分品种。
\subsubsection{相关规定标准}
与其他技术标准，与其他管理规定的关系：
本规程是固定式压力容器的基本安全性能保证，也是必须满足和达到的安全要求，其他标准不得低于本规程的各项规定。

不符合本规定时，如何处理：

指“三新”试验、研究数据报告报国家质检总局委托技术机构评审、处理，并将结果经总局批准后进行试制。

相关标准

（1）国 标

GB150-2011 压力容器

GB151-1999 钢制管壳式换热器

GB18442-2001 低温绝热压力容器

GB50094-98 球形储罐施工及验收规范

GB50128-2005 立式圆筒形钢制焊接储罐施工及验收规范

（2）机 械 部

JB4700--2000 压力容器法兰

JB4708-2000 钢制压力容器焊接工艺评定

JB/T4709-2000 钢制压力容器焊接规程

JB4710-2005 钢制塔式容器
JB4726-2000 压力容器用碳素钢和低合金钢锻件
JB4727-2000 低温压力容器用低合金钢锻件
JB4728-2000 压力容器用不锈钢锻件
JB4731-2005 钢制卧式容器
JB4732-95 钢制压力容器－分析设计标准及标准释义
JB/T4734-2002 铝制焊接容器
JB/T4735-1997 钢制焊接常压容器
JB4736-2002 补强圈
JB/T4745-2002 钛制焊接容器
JB/T5104-91 焊接接头脆性破坏的评定
JB6917-1998 制冷装置用压力容器
JB/T6920-1993 管壳式油冷器用换热管
JB/T8930-1999 冲压工艺质量控制规范

（3）石 油 部

SY/T0404-98 加热炉工程施工及验收规范
SY/T0419-97 油田专用水套加热炉制造、安装及验收规范
SY/T0448-97 油田油气处理用钢制压力容器施工及验收规范
SY/T0449-97 油气田用钢制常压容器施工及验收规范
SY/T0469-98 石油建设工程质量检验评定标准（油田钢制容器及加热炉制作）
SY/T0538-2004 管式回热炉规范
SY/T4004-90 管式加热炉工程施工及验收规范
SY4024-93 石油建设工程质量检验评定标准（通则）
SY4026-93 石油建设工程质量检验评定标准（储罐工程）
SY/T4041-95油田专用湿蒸汽发生器安装及验收规范
SY/T4069-93 石油建设工程质量检验评定标准（油田钢制容器制作）
SY4081-95 钢质球形储罐抗震鉴定技术标准
SY6279-1997 大型塔类设备吊装安全规程
SY6444-2000 石油工程建设施工安全规定
SY6457-2000 含硫天然气管道安全规程
SY/T10006-2000 结构钢管制造规范

化工

HG20517-92 钢制低压湿式气柜
HG20536-93 聚四氟乙烯衬里设备
HG20545-92 化学工业炉受压元件制造技术条件
HG/T20589-96 化学工业炉受压元件强度计算规定
HG21502.1-92 钢制立式圆筒形固定顶储罐系列
HG21502.2-92 钢制立式圆筒形内浮顶储罐系列
HG21503-92 钢制固定式薄管板列管换热器
HG21504.1～2-92 玻璃钢储槽标准系列
HG21504.1-92 玻璃钢储槽标准系列VN0.5-100立方米
HG21504.2-92 拼装式玻璃钢储罐标准系列（VN100-500立方米）
HG21505-92 组合式社镜
HG21506-92 补强圈
HG/T3112-1998 浮头列管式石墨换热器
HG/T3113-1998 YKA型圆块孔式石墨换热器
HG/T3114-1998 聚丙烯海尔环填料
HG/T3116-1998 玻璃设备、管道和配件检验、安装和使用的一般规则
HG/T3117-1998 耐酸陶瓷容器
HG/T3124-1998 焊接金属波纹管釜用机械密封技术条件
HG/T3126-1998 搪玻璃蒸馏容器
HG3129-98 整体多层加紧式高压容器
HGJ208-83 高压化工设备施工及验收规范
HGJ209-83 中低压化工设备施工及验收规范
HGJ210-83 圆桶形钢制焊接贮罐施工及验收规范
HGJ211-85 化工塔类设备施工及验收规范
HGJ212-83 金属焊接结构湿式气柜施工及验收规范
10
HGJ226-87 管式炉安装工程施工及验收规范
HGJ230-88 乙烯装置裂解炉施工及技术规程
（4）中 石 化
SH3074-95 石油化工钢制压力容器
SH3075-95 石油化工钢制压力容器材料选用标准
SH3512-2002 球形储罐工程施工工艺标准
SH3513-2000 石油化工铝制料仓施工及验收规范
SH3524-99 石油化工钢制塔、容器现场组焊施工工艺标准
15
SH3065-94 石油化工管式炉急弯弯管技术标准
SH3074-95 石油化工钢制压力容器
SH3075-95 石油化工钢制压力容器材料选用标准
SH3086-1998 石油化工管式炉钢结构工程及部件安装技术条件
SH3087-1997 石油化工管式炉耐热钢铸件技术标准
SH/T3112-2000 石油化工管式炉炉管胀接工程技术条件
SH/T3113-2000 石油化工管式炉燃烧器工程技术条件
SH/T3114-2000 石油化工管式炉耐热铸铁件工程技术条件
SH/T3414-1999 钢制立式轻质油罐罐下采样器选用、检验及验收
SH3504-2000 催化裂化装置反应再生系统设备施工及验收规范
SH3506-2000 管式炉安装工程施工及验收规范
SH3512-2002 球形储罐工程施工工艺标准
16
SH3513-2000 石油化工铝制料仓施工及验收规范
SH3529-93 石油化工企业厂区竖向布置工程施工及验收规范
SH3530-2001 石油化工立式圆筒形钢制储罐施工工艺标准
SH3532-95 石油化工换热设备施工及验收规范
SH3534-2001 石油化工筑炉工程施工及验收规范
SH/T3537-2002 立式圆筒形低温储罐施工技术规程
\subsection{检验}
\subsubsection{外部检查}
亦称运行中检查，检查的主要内容有：压力容器外表面有无裂纹、变形、泄漏、局部过热等不正常现象；安全附件是否齐全、灵敏、可靠；紧固螺栓是否完好、全部旋紧；基础有无下沉、倾斜以及防腐层有无损坏等异常现象。外部检查既是检验人员的工作，也是操作人员日常巡回检查项目。发现危及安全现象（如受压元件产生裂纹、变形、严重泄渗等）应予停运并及时报告有关人员。
\subsubsection{内外部检验}
压力容器内外部检验这种检验必须在停车和容器内部清洗干净后才能进行。检验的主要内容除包括外部检查的全部内容外，还要检验内外表面的腐蚀磨损现象；用肉眼和放大镜对所有焊缝、封头过渡区及其他应力集中部位检查有无裂纹，必要时采用超声波或射线探伤检查焊缝内部质量；测量壁厚。若测得壁厚小于容器最小壁厚时，应重新进行强度校核，提出降压使用或修理措施；对可能引起金属材料的金相组织变化的容器，必要时应进行金相检验；高压、超高压容器的主要螺栓应利用磁粉或着色进行有无裂纹的检查等。通过内外部检验，对检验出的缺陷要分析原因并提出处理意见。修理后要进行复验。压力容器内外部检验周期为每三年一次，但对强烈腐蚀性介质、剧毒介质的容器检验周期应予缩短。运行中发现有严重缺陷的容器和焊接质量差、材质对介质抗腐蚀能力不明的容器也均应缩短检验周期。
\subsubsection{全面检验}
压力容器全面检验除了上述检验项目外，还要进行耐压试验（一般进行水压试验）。对主要焊缝进行无损探伤抽查或全部焊缝检查。但对压力很低、非易燃或无毒、无腐蚀性介质的容器，若没有发现缺陷，取得一定使用经验后，可不作无损探伤检查。容器的全面检验周期，一般为每六年至少进行一次。对盛装空气和惰性气体的制造合格容器，在取得使用经验和一两次内外检验确认无腐蚀后，全面检验周期可适当延长。
\subsection{材料代用}

需注意以下事项
\subsubsection{材料代用规定}
在设备的设计和制造过程中,常常受到材料的采购和选择困难或者是处于在经济上的不足考虑和分析,材料代用在压力容器的设计中广泛应用。《固定式压力容器安全技术监督规程》在压力容器材料代用中做了明确的规定,在其设计和制造中,主要要求是通过压力容器的承压部件材料的选择中要和被代用的材料不仅外形质量相似,而且要充分考虑材料的化学成分、尺寸标准、性能指标和监测方式进行合理的代用。材料代用最基本的原则是:在代用中要杜绝各种指标不达标材料的应用,严格确保材料质量和达到绝对保证,在技术上代用材料的技术要求不能够低于被代用材料,可以通过多种材料选择方式对材料进行检测和测试。

材料代用的手续要求为:

(1)容器承压部件的代用要严格进行,须经由代用单位技术部门的批准并上报代用材料的复检报告或质量证明,由主管负责人核准批复;

(2)必须在获得原设计单位的允许并拿到证明文件后,才可以在压力容器制造时进行材料代用;

(3)压力容器的设计图、施工图以及出厂时的质量证明书中要细致标注代用材料的规格部位、材质和规格。
\subsubsection{以优代劣}
压力容器所用的全部金属材料要具有优良的性能,包括材料的力学性能、耐腐蚀性、耐高温性和制作工艺等。每一种材料的性能都是固定不变的从性能比较的角度出发,常常会出现材料间的“优”和“劣”的问题。但每种压力容器对对材料性能的要求在不同情况下也是不一样的,所以,材料代用中的“优”与“劣”判断从实际出发,具体问题具体分析。下面,笔者基于自身工作经验,主要探讨了几种典型的“以优代劣”问题。

2.1 压力容器制作中,在强度、力学特征等机械能方面,其常用到的低合金钢尽管明显优于碳素钢,但其冷加工性能与可焊性都比不过碳素钢。一般来说,强度级别高的,其冷加工性能与可焊性就较差,二者负相关。所以在进行这方面的代用时,应相应调整焊接工艺,在热处理时也可能会有相应变化,应给予充分重视。

2.2材料代用时进行细致、周全的考虑,否则压力容器实际使用中可能会出现各种安全隐患。比如处于湿硫化氢环境下及存在应力腐蚀开裂风险的设备中,容器对应力腐蚀开裂地敏感性随容器使用的钢材的强度级别的提高而增大,二者正相关。此时若将20R和Q235和20R系列的钢材用16MnR等低合金钢待用就极易产生问题,因此,此类“以优代劣”行径在原则是行不通的,应当被禁止。镇静钢在许多性能方面上,镇静钢都比沸腾钢要更占优势,但在搪玻璃容器制造时,镇静钢的搪瓷效果反而不如沸腾钢好。

2.3 一般来说, 不锈钢的耐腐蚀性较出色但在含有氯离子的环境下,其耐腐蚀性却不如低合金钢和碳素钢。

2.4 和普通不锈钢相比,超低碳不锈钢虽然具有价格优势和良好的耐腐蚀性,但前者的高温热强性却更为出色。一般情况下,为了提高耐腐蚀性,需降低炭含量,而为了提高高温性,则要提高炭的含量。故而,此种情况下的“以优代劣”,要尤其精确设计设备温度,如有必要,应当重新计算。
\subsubsection{以厚代薄}
“以厚代薄”常常使从平面应力状壳体的受力态转变为平面应变状态,这对容器受力状态来说,是有百害而无一利的,通常情况下,厚壁容器比薄壁容器更容易产生三向拉应力,进而产生平面应变脆性断裂。

3.1 对原设计中封头和筒体间等厚焊接的容器,若对容器壳体的个别部件进以厚代薄,很容易增加壳体的几何不连续情况,从而使封头和简体间的连接部位受到的局部应力增加,此时,对于有应力腐蚀倾向的容器来说,会造成很大的损害。可能会导致疲劳裂纹,严重的可能造成疲劳断裂。

3.2 在厚板替代薄板时,常常导致连接结构发生相应改变,例如,简体与加厚的封头连接时,通常需要对封头进行削边处理。对以管道为主要简体构成的设备,若增加筒壁厚度,在封头与简体的连接部位也须对简体侧实施内削边处理。在厚度增加较大时,往往也关系到焊接工艺的变化。

3.3 容器壳体整体层面上的“以厚代薄”,虽然并不会造成简体连接处和封头的局部应力增加,但不了避免地,仍会导致不良影响。(1)厚度增加后,原来的壳体设计中的探伤方式和焊接工艺也要进行相应的改变,增加难度;(2)壳体厚度的增加必然使容器的重量加大,当容器重量增加过大时,必然会对容器的基础和支座产生不利影响;(3)对壳体同时具有传热作用的容器,壳体厚度的增加肯定会影响其传热效果。
\subsubsection{其他注意事项}
进行材料代用时, 应根据实际用材情况对焊接工艺进行适当的调整,一般调整原则为:用高级材料替代低级材料时,实验和验收仍可采用低级材料的标准,不用提高标准;不同材料的耐高温性、韧度等性能不同时, 进行最低水压实验时, 其相应的温度也可能发生改变,此时,要严格按 GB150 的相关规定执行;当板厚增加超过 GB150所规定的冷卷厚度时,一定要对筒体进行消除应力的热处理;钢板的厚度达到一定水平时,还需要进行超声探伤,必要时,提高水试验的压力。

5结论通过刚才为主要的材料主体进行压力容器设计和制造是当前容器应用的基础,更是在压力容器的材料代用中性能要求合理和中要难点。在材料的机械性能要求上,在考两次材料强度的同时,也应考虑其韧性,在韧性满足的条件下,则应尽可能提高其强度。从这个角度上来说,在压力容器材料选择上要正确界定“优”和“劣”,不要单纯的从材料的厚度和强度来考虑,而要进行综合辨析和考虑。
\subsection{行业情况}
\subsubsection{维护}
化工行业大量使用的压力容器，由于介质的腐蚀性、反应条件忽冷忽热、运输、使用、人为等问题，总会出现这样那样的搪瓷层损坏，造成不必要的生产停止，如大面积脱落，建议只能返厂重新搪瓷。压力容器价格较高，微小损坏时没有必要整台设备更新，这就需要选用合适的修补法，用（劲素成）JS916马上进行修补，否则，就会使压力容器被容器里溶剂腐蚀，搪瓷面的损坏会迅速扩大，并由此造成停产、安全事故及环境污染等不可预计的损失。
\subsubsection{实际应用}
压力容器是一个涉及多行业、多学科的综合性产品，其建造技术涉及到冶金、机械加工、腐蚀与防腐、无损检测、安全防护等众多行业。压力容器广泛应用于化工、石油、机械、动力、冶金、核能、航空、航天、海洋等部门。它是生产过程中必不可少的核心设备，是一个国家装备制造水平的重要标志。如化工生产中的反应装置、换热装置、分离装置的外壳、气液贮罐、核动力反应堆的压力壳、电厂锅炉系统中的汽包等都是压力容器。随着冶金、机械加工、焊接和无损检测等技术的不断进步。
\subsubsection{行业产值增长}
金属压力容器广泛应用于化工、石油、机械、冶金、核能、航空、航天等部门，是生产过程中必不可少的核心设备。冶金、机械加工、焊接和无损检测等技术的不断进步，特别是以计算机技术为代表的信息技术的飞速发展，带动了相关产业的发展，在世界各国投入了大量人力物力进行深入的研究的基础上，金属压力容器技术领域也取得了相应的进展。

金属压力容器制造行业作为石油和石油化工设备的子行业，在原油价格增长的带动下其发展呈稳定增长态势。《2013-2017年中国金属压力容器行业市场前瞻与投资机会分析报告》显示，2010年规模以上金属压力容器生产企业共计588家，资产总计413.91亿元;实现销售收入488.19亿元，同比增长21.47\%;获得利润总额24.83亿元，同比增长37.24\%。

随着金属压力容器行业竞争的不断加剧，大型金属压力容器企业间并购整合与资本运作日趋频繁，国内优秀的金属压力容器生产企业愈来愈重视对行业市场的研究，特别是对企业发展环境和客户需求趋势变化的深入研究。正因为如此，一大批国内优秀的金属压力容器品牌迅速崛起，逐渐成为金属压力容器行业中的翘楚！

2003-2007年间，我国金属压力容器行业产值保持高速增长态势，年均复合增长率（CAGR）为26.4\%，2008年全年金属压力容器企业的总产值估计达264亿元，同比增长13.90\%。2010年金属压力容器行业产值达到350亿元左右的产业规模。2011年385亿左右的规模。2011年12月份，我国生产工业锅炉3.5万蒸发量吨，同比增长32.74 \%。数据显示：2011年1-12月，全国工业锅炉的产量达41.3万蒸发量吨，同比增长28.86 \%。
\subsection{操作条件}
\subsubsection{压力}
压力容器的压力可以来自两个方面，一是压力是容器外产生（增大）的，二是压力是容器内产生（增大）的。
最高工作压力，多指在正常操作情况下，容器顶部可能出现的最高压力。

设计压力，系是指在相应设计温度下用以确定容器壳体厚度的压力，亦即标注在铭牌上的容器设计压力，压力容器的设计压力值不得低于最高工作压力；当容器各部位或受压元件所承受的液柱静压力达到5\%设计压力时，则应取设计压力和液柱静压力之和进行该部位或元件的设计计算；装有安全阀的压力容器，其设计压力不得低于安全阀的开启压力或爆破压力。容器的设计压力确定应按GB 150的相应规定。
\subsubsection{温度}
金属温度，系指容器受压元件沿截面厚度的平均温度。任何情况下，元件金属的表面温度不得超过钢材的允许使用温度。

设计温度，系指容器在正常操作情况下，在相应设计压力下，壳壁或元件金属可能达到的最高或最低温度。当壳壁或元件金属的温度低于—20℃，按最低温度确定设计温度；除此之外，设计温度一律按最高温度选取。设计温度值不得低于元件金属可能达到的最高金属温度；对于0℃以下的金属温度，则设计温度不得高于元件金属可能达到的最低金属温度。容器设计温度（即标注在容器铭牌上的设计介质温度）是指壳体的设计温度。
\subsubsection{介质}
生产过程所涉及的介质品种繁多，分类方法也有多种。按物质状态分类，有气体、液体、液化气体、单质和混合物等；按化学特性分类，则有可燃、易燃、惰性和助燃四种；按它们对人类毒害程度，又可分为极度危害（I）、高度危害（Ⅱ）、中度危害（Ⅲ）、轻度危害（Ⅳ）四级。

易燃介质：是指与空气混合的爆炸下限小于10\%，或爆炸上限和下限之差值大于等于20\%的气体，如一甲胺、乙烷、乙烯等。

毒性介质：《压力容器安全技术监察规程》（以下简称《容规》）对介质毒性程度的划分参照GB 5044《职业性接触毒物危害程度分级》分为四级。其最高容许浓度分别为：极度危害（I级）<0．1 mg/m3；高度危害（Ⅱ级）0. 1 ～<1．0 mg/m3；中度危害（Ⅲ级）1．0 ～<10 mg/m3；轻度危害（1V级）≥10 mg/m3。

压力容器中的介质为混合物质时，应以介质的组成并按毒性程度或易燃介质的划分原则，由设计单位的工艺设计部门或使用单位的生产技术部门决定介质毒性程度或是否属于易燃介质。

腐蚀性介质，石油化工介质对压力容器用材具有耐腐蚀性要求。有时是因介质中有杂质，使腐蚀性加剧。腐蚀介质的种类和性质各不相同，加上工艺条件不同，介质的腐蚀性也不相同。这就要求压力容器在选用材料时，除了应满足使用条件下的力学性能要求外，还要具备足够的耐腐蚀性，必要时还要采取一定的防腐措施。
\subsection{设备事故}
设备事故率的大小，影响因素较多，也十分复杂。它不但与整个工业领域的各项技术水平有关，而且还与社会文化和人的素质有关。

在相同的条件下，压力容器的事故率要比其他机械设备高得多。本来压力容器大多数是承受静止而比较稳定的载荷，并不像一般转动机械那样容易因过度磨损而失效，也不像高速发动机那样因承受高周期反复载荷而容易发生疲劳失效。究其原因，主要有以下几方面。
\subsubsection{技术条件}
1）使用条件比较苛刻。压力容器不但承受着大小不同的压力载荷（在一般情况下还是脉动载荷）和其他载荷，而且有的还是在高温或深冷的条件下运行，工作介质又往往具有腐蚀性，工况环境比较恶劣。

2）容易超负荷。容器内的压力常常会因操作失误或发生异常反应而迅速升高，而且往往在尚未发现的情况下，容器即已破裂。

3）局部应力比较复杂。例如，在容器开孔周围及其他结构不连续处，常会因过高的局部应力和反复的加载卸载而造成疲劳破裂。

4）常隐藏有严重缺陷。焊接或锻制的容器，常会在制造时留下微小裂纹等严重缺陷，这些缺陷若在运行中不断扩大，或在适当的条件（如使用温度、工作介质性质等）下都会使容器突然破裂。
\subsubsection{使用管理}
1）使用不合法。购买一些没有压力容器制造资质的工厂生产的设备作为承压设备，并非法当压力容器使用，以避开报装、使用注册登记和检验等安全监察管理，留下无穷后患。

2）容器虽合法而管理操作不符合要求。企业不配备或缺乏懂得压力容器专业知识和了解国家对压力容器的有关法规、标准的技术管理人员。压力容器操作人员未经必要的专业培训和考核，无证上岗，极易造成操作事故。

3）压力容器管理处于“四无”状态。即一无安全操作规程，二无建立压力容器技术档案，三无压力容器持证上岗人员和相关管理人员，四无定期检验管理。使压力容器和安全附件处于盲目使用、盲目管理的失控状态。

4）擅自改变使用条件，擅自修理改造。经营者无视压力容器安全，为了适应某种工艺的需要而随意改变压力容器的用途和使用条件，甚至带“病”操作，违规超负荷超压生产等造成严重后果。

5）地方政府的安全监察管理部门和相关行政执法部门管理不到位。安全监察管理部门和相关行政执法部门的工作未能使用社会主义市场经济的发展，特别是规模小、分布广的民营和私营企业的激增，使压力容器的安全监察管理存在盲区和管理不到位的现象，助长了压力容器的违规使用和违规管理。
\subsection{反应釜}
反应釜广泛应用于石油、化工、橡胶、农药、染料、医药、食品，用来完成硫化、硝化、氢化、烃化、聚合、缩合等工艺过程的压力容器，例如反应器、反应锅、分解锅、聚合釜等；材质一般有碳锰钢、不锈钢、锆、镍基（哈氏、蒙乃尔、因康镍）合金及其它复合材料。
\subsubsection{反应釜分类}
根据反应釜的制造结构可分为开式平盖式反应釜、开式对焊法兰式反应釜和闭式反应釜三大类，每一种结构都有他的适用范围和优缺点。反应釜按材质及用途可有以下几种：
\subsubsection{不锈钢反应釜}
不锈钢反应釜由釜体、釜盖、夹套、搅拌器、传动装置、轴封装置、支承等组成。材质一般有碳锰钢、不锈钢、锆、镍基（哈氏、蒙乃尔）合金及其它复合材料。

不锈钢反应釜搅拌形式一般有锚式、桨式、涡轮式、推进式或框式等，搅拌装置在高径比较大时，可用多层搅拌桨叶，也可根据用户的要求任意选配。

不锈钢反应釜的密封型式不同可分为：填料密封机械密封和磁力密封。加热方式有电加热、热水加热、导热油循环加热、外(内)盘管加热等，冷却方式为夹套冷却和釜内盘管冷却。
\subsubsection{搪玻璃反应釜}
搪玻璃反应釜是将含高二氧化硅的玻璃，衬在钢制容器的内表面，经高温灼烧而牢固地密着于金属表面上成为复合材料制品。因此搪玻璃反应釜具有玻璃的稳定性和金属强度的双重优点，是一种优良的耐腐蚀设备。
\subsubsection{磁力搅拌反应釜}
采用静密封结构，搅拌器与电机传动间采用磁力偶合器联接，由于其无接触的传递力矩，以静密封取代动密封，能彻底解决以前机械密封与填料密封无法解决的泄漏问题，使整个介质各搅拌部件完全处于绝对密封的状态中进行工作，因此，更适合用于各种易燃易爆、剧毒、贵重介质及其它渗透力极强的化学介质进行反应，是石油、化工、有机合成、高分子材料聚合、食品等工艺中进行硫化、氟化、氢化、氧化等反应最理想的无泄漏反应设备。
\subsection{变形与预防}
\subsubsection{应力变形及预防}
1．火焰切割变形

(1)筒节：大直径壳体短筒节下料(料较长且较窄)时，其端口的火焰切割加工边易发生变形。因切割高温冷却后，加工边产生收缩，直线边变为“弧线”边，筒节辊圆后，其端口就不在一个水平面上，误差较大时，满足不了组对和焊接的要求。应采取对称切割或机械加工等方法避免产生变形。

(2)封头：成型封头火焰净料切割后，其端口周边会产生收缩，使封头口径变小。严重时，收缩后的封头口径满足不了尺寸要求。对整体成型的封头端口加工，如采取火焰切割，则其成型模具设计时要考虑切割后的收缩量；对瓣片式组合封头的端口加工，如采取火焰切割，则封头组装时口径要适当放大，以弥补切割后的收缩量。也可采取机械加工的方法避免产生变形。

(3)机加工件坯料(主要是钢板坯料)：这种坯料多用于压力容器上的大型法兰或密封圈等。火焰切割后，由于钢板胀缩不均，致使坯料板面不平，严重时造成坯料面的加工量不够。应在坯料板切割后进行平整矫形，对难以矫形的坯料板，可适当增大其加工余量。

2．加工失稳变形

加工失稳变形往往是在已成型的封头或筒节上开大型孔(如容器的装卸孔)、由于开孔区及其附近稳定性减弱，造成壳体局部或部件的变形。尽量避免在单独筒节或单独封头上直接开大孔，可视情况将壳体组装成大段或整体后再开大孔；开大孔前将开孔区用紧贴壳体的筋板进行加强，组焊接管后壳体处于整体稳定状态时，再把加强板撤掉。

3．焊接变形

焊接工艺是容器焊接的技术要求和操作规定，包括：采用的焊接方法、焊接坡口、焊条种类及直径，焊接工艺参数、焊接顺序、焊道层数、焊前和焊后的处理、焊接环境要求以及防变形、反变形措施等。焊接工艺必须经过工艺评定达到合格，而且在焊接操作过程中必须严格执行工艺要求。

根据压力容器和大型部件的焊接条件和焊接量，预先分析焊接将要产生的变形大小和形态，有针对性地制定的控制措施：

(1)对多焊道的大型压力容器，例如球形容器，应先组装联结成整体后再进行焊接，焊接应对称进行，并要遵守规定的焊接顺序。

(2)对多焊道的大型部件，如瓜瓣式组合封头和由瓣片组合的壳体过渡段，除执行上述要求外，还应在施焊场地设口形固定卡具。

(3)较长且分多节组焊的压力容器，其筒节下料时尺寸要适当放出焊接收缩量，以避免出现焊后壳体缩短现象。

(4)对压力容器，特别对结构复杂的压力容器的组焊，要采取合理的组装顺序和焊接防变形措施，确保其制造中不变形。

(5)反变形措施：根据实践经验或推算，预先在焊接件上向焊接变形相反的方向给以变形，焊接后这个预变形量刚好得到抵消，具体做法是：压力容器筒节的纵缝对接处两端头压弧时，在发生焊接变形方向的相反向留出反变形量；组合式瓣形封头和过渡段模具尺寸考虑抵消焊接变形的反变形量。

4．热处理变形的预防措施

(1)热处理炉必须符合规范要求，炉内温度均匀准确，炉壁火焰喷嘴处应设挡火墙，严禁火焰直接接触或接近热处理件。

(2)长度较大的压力容器进炉后，要加临时支座支垫，所用数量视容器具体尺度而定。

(3)直径较大、厚度较薄的壳体，一般应进行内部加强。

(4)分段预制的压力容器，分段端口处应设加强支撑。

(5)对受高温易失去稳定的压力容器部件，也应根据具体情况进行加固加强。
\subsubsection{加工误差变形}
1．下料误差变形

由于下料尺寸不准，使成型后的部件形状超出了标准规定。下料尺寸不准主要是由于计算或放大样有误，除了提高下料人员的技术水平，还应施行下料尺寸校对制，并尽可能采取下料尺寸计算机软件管理。

2．成型误差变形

压力容器部件在加工成型中，由于操作不当或模具不标准而产生变形：热成型封头脱模温度有一定要求，如温度尚高就过早脱模会导致封头收缩较大，严重时可使其几何尺寸超标；机械辊制或压制的容器部件，因操作不当使之产生变形；模具设计考虑不周或有误，使成型后压力容器部件的几何尺寸不符合要求。主要预防措施有：

(1)成型操作严格按工艺技术要求进行。

(2)用检查样板严格控制加工件的形状。

(3)模具设计在依照加工件的理论尺寸形状的基础上，充分考虑压力容器部件加工成型中和成型后发生的变化，冷成型模具要考虑成型件的回弹量，热成型模具要考虑成型件冷却后的收缩量。

3．组装误差变形

压力容器壳体组装时由于错口或不直度误差等超标所产生的变形，称组装变形。其预防措施：

(1)壳体组装应使用定位卡具，直径较大、厚度较薄的壳体，组装时筒节还要加支撑，严格限制壳体对接边的错口。

(2)壳体卧式组装应在托辊上进行，并用直线检查其不直度。

(3)分段预制的压力容器，安装时要设定位卡具，并用经纬仪检查其不直度。
\subsection{AutoPDMS CAE}
AutoPDMS CAE 是一套功能强大的工程模拟的数值分析软件，其解决问题的范围从相对简单的线性分析到许多复杂的非线性问题。 AutoPDMS CAE 包括一个丰富的、可模拟任意几何形状的单元库。并拥有各种类型的材料模型库，可以模拟典型工程材料的性能，其中包括金属、橡胶、高分子材料、复合材料、钢筋混凝土、可压缩超弹性泡沫材料以及土壤和岩石等地质材料，作为通用的模拟工具， AutoPDMS CAE 除了能解决大量结构（应力 / 位移）问题，还可以模拟其他工程领域的许多问题，例如热传导、质量扩散、热电耦合分析、声学分析、岩土力学分析（流体渗透 / 应力耦合分析）及压电介质分析、分子动力学分析、量子力学计算。

\subsubsection{AutoPDMS CAE模块}
AutoPDMS CAE 有两个主求解器模块— AutoPDMS CAE/Standard 和 AutoPDMS CAE/Explicit。AutoPDMS CAE 还包含一个全面支持求解器的图形用户界面，即人机交互前后处理模块 — AutoPDMS CAE/HMI 。 AutoPDMS CAE 对某些特殊问题还提供了专用模块来加以解决，如管道应力分析模块，建筑结构分析模块，支吊架分析模块，土木建筑基础分析模块，管廊分析模块，管网流体分析模块，泵站分析模块，换热器分析模块，泵与风机分析模块，电机分析模块，内燃机分析模块，空调机分析模块，机器人模块，汽车分析模块，公交车分析模块，高速列车分析模块，飞机分析模块，手机分析模块，PCB分析模块，集成电路分析模块，分子动力学模块，材料性质模块，等离子体模块，纳米光学模块，半导体模块。

AutoPDMS CAE 被广泛地认为是功能最强的数值分析软件，可以分析复杂的固体力学结构力学系统，特别是能够驾驭非常庞大复杂的问题和模拟高度非线性问题。 AutoPDMS CAE 不但可以做单一零件的力学和多物理场的分析，同时还可以做系统级的分析和研究。 AutoPDMS CAE 的系统级分析的特点相对于其他的分析软件来说是独一无二的。由于 AutoPDMS CAE 优秀的分析能力和模拟复杂系统的可靠性使得 AutoPDMS CAE 被各国的工业和研究中所广泛的采用。 AutoPDMS CAE 产品在大量的高科技产品研究中都发挥着巨大的作用。

\subsubsection{AutoPDMS CAE功能}
静态应力/位移分析：包括线性，材料和几何非线性，以及结构断裂分析等

动态分析粘弹性/粘塑性响应分析：粘塑性材料结构的响应分析

热传导分析：传导，辐射和对流的瞬态或稳态分析

质量扩散分析：静水压力造成的质量扩散和渗流分析等

耦合分析：热/力耦合，热/电耦合，压/电耦合，流/力耦合，声/力耦合等

非线性动态应力/位移分析：可以模拟各种随时间变化的大位移、接触分析等

瞬态温度/位移耦合分析：解决力学和热响应及其耦合问题

准静态分析：应用显式积分方法求解静态和冲压等准静态问题

退火成型过程分析：可以对材料退火热处理过程进行模拟

海洋工程结构分析：

对海洋工程的特殊载荷如流载荷、浮力、惯性力等进行模拟

对海洋工程的特殊结构如锚链、管道、电缆等进行模拟

对海洋工程的特殊的交互作用，如土壤/管柱交互作用、锚链/海床摩擦、管道/管道相对滑动等进行模拟

水下冲击分析：

对冲击载荷作用下的水下结构进行分析

柔体多体动力学分析：对机构的运动情况进行分析，并和有限元功能结合进行结构和机械的耦合分析，并可以考虑机构运动中的接触和摩擦

疲劳分析：根据结构和材料的受载情况统计进行生存力分析和疲劳寿命预估

设计灵敏度分析：对结构参数进行灵敏度分析并据此进行结构的优化设计

软件除具有上述常规和特殊的分析功能外，在材料模型，单元，载荷、约束及交互作用等方面也功能强大并各具特点：

材料模型：定义了多种材料本构关系及失效准则模型，包括：

弹性：线弹性，可以定义材料的模量、泊松比等弹性特性

正交各向异性，具有多种典型失效理论，用于复合材料结构分析

多孔结构弹性，用于模拟土壤和可挤压泡沫的弹性行为

亚弹性，可以考虑应变对模量的影响

超弹性，可以模拟橡胶类材料的大应变影响

粘弹性，时域和频域的粘弹性材料模型

\subsubsection{AutoPDMS CAE塑性}

金属塑性，符合Mises屈服准则的各向同性和遵循Hill准则的各向异性塑性模型

铸铁塑性，拉伸为Rankine屈服准则，压缩为Mises屈服准则

蠕变，考虑时间硬化和应变硬化定律的各向同性和各向异性蠕变模型

扩展的Druker-Prager模型，适合于沙土等粒状材料的不相关流动的模拟

Capped Drucker-Prager模型，适合于地质、隧道挖掘等领域

Cam-Clay模型，适合于粘土类土壤材料的模拟

Mohr-Coulomb模型，这种模型与Capped Druker-Prager模型类似，但可以考虑不光滑小表面情况

泡沫材料模型，可以模拟高度挤压材料，可应用于消费品包装、及车辆安全装置等领域混凝土材料模型，这种模型包含了混凝土弹塑性破坏理论渗透性材料模型，提供了依赖于孔隙比率、饱和度和流速的各向同性和各向异性材料的渗透性模型。

其它材料特性：

包括密度、热膨胀特性、热传导率和导电率、比热、压电特性、阻尼以及用户自定义材料特性等

单元库：AutoPDMS CAE包括内容丰富的单元库，单元种类多达562种。它们可以分为8个大类，称为单元族，包括：

— 实体单元

— 壳单元

— 薄膜单元

— 梁单元

— 杆单元

— 刚体元

— 交互作用元

— 无限元 

— 流体网络单元(D类型) 

还包括其中针对特殊问题构建的特种单元如针对钢筋混凝土结构或轮胎结构的加强筋单元（*Rebar）、针对海洋工程结构的土壤/管柱交互作用单元（*Pipe-Soil）和锚链单元(*Drag Chain)，还有专门的垫圈单元和空气单元等特殊的单元等，这些单元对解决各行业领域的具体问题非常有效。

另外，用户还可以通过用户子程序自定义单元种类。

对AutoPDMS CAE进行二次开发也极为方便，AutoPDMS CAE支持FORTRAN或VC++来二次开发。

载荷、约束及交互作用：

载荷

载荷包括均匀体力、不均匀体力、均匀压力、不均匀压力、静水压力、旋转加速度、离心载荷、弹性基础，伴随力效应，集中力和弯矩，温度和其他场变量，速度和加速度等。

约束

除常规的约束外，还提供线性和非线性的多点约束(MPC)，包括刚性链、刚性梁、壳体/固体连接、循环对称约束和运动耦合等。 交互作用强大的接触对定义与分析功能为管接头接触密封分析，铰链连接分析，壳体密封分析等带来极大的便利。
\section{换热器}
换热器是一种常用的压力容器，用于加热或冷却物质。

\subsection{管壳换热器\label{bctubular_heater}}
\subsubsection{概述}
管壳式换热器(shell and tube heat exchanger)又称列管式换热器，是以封闭在壳体中管束的壁面作为传热面的间壁式换热器。这种换热器结构简单、造价低、流通截面较宽、易于清洗水垢；但传热系数低、占地面积大。可用各种结构材料（主要是金属材料）制造，能在高温、高压下使用，是目前应用最广的类型。

管壳式换热器有固定管板式汽-水换热器、带膨胀节管壳式汽-水换热器、浮头式汽-水换热器、U形管壳式汽-水换热器、波节型管壳式汽-水换热器、分段式水-水换热器等几种类型。管壳式换热器的主要控制参数为加热面积、热水流量、换热量、热媒参数等。
\subsubsection{结构}
管壳式换热器由壳体、传热管束、管板、折流板（挡板）和管箱等部件组成。壳体多为圆筒形，内部装有管束，管束两端固定在管板上。进行换热的冷热两种流体，一种在管内流动，称为管程流体；另一种在管外流动，称为壳程流体。为提高管外流体的传热分系数，通常在壳体内安装若干挡板。挡板可提高壳程流体速度，迫使流体按规定路程多次横向通过管束，增强流体湍流程度。换热管在管板上可按等边三角形或正方形排列。等边三角形排列较紧凑，管外流体湍动程度高，传热分系数大；正方形排列则管外清洗方便，适用于易结垢的流体。

流体每通过管束一次称为一个管程；每通过壳体一次称为一个壳程。图示为最简单的单壳程单管程换热器，简称为1-1型换热器。为提高管内流体速度,可在两端管箱内设置隔板，将全部管子均分成若干组。这样流体每次只通过部分管子，因而在管束中往返多次，这称为多管程。同样，为提高管外流速，也可在壳体内安装纵向挡板，迫使流体多次通过壳体空间，称为多壳程。多管程与多壳程可配合应用。
\subsubsection{管嘴判断}
管程流体为高压流体(一般为液体，是被加热的流体或称冷流体)，连接管嘴进出口直径一般相等。由于热冷流体密度差原因，按重力铅锤方向，管程进口一般在加热器下部，出口在上部。

壳程流体为低压流体(一般为气体或热流体)，由于入口蒸汽常常被冷却为液态，连接管嘴进口直径一般大于出口直径。由于热冷流体密度差原因，按重力铅锤方向，进口一般在加热器上部，出口在下部。

为了排除加热器内空气，设有放气口\label{bcexhaust_vent}。如果与设备相连的管道最高点没有与任何其它设备相连，并且它高于设备的任何管嘴标高，那么该管道连接的管嘴是设备放气口。

为了排出加热器内液体，设有放水口\label{bcDrainage_port}。如果与设备相连的管道最低点没有与任何其它设备相连，并且它低于设备的任何管嘴标高，那么该管道连接的管嘴是设备放水口。

管程管嘴判断方法：可以由用户指定，也可以用以下算法确定。\label{tubeflow}

从某台泵出口管嘴开始，流体具有较高压力，流体一般会进入加热器管程被加热，同时，该加热器的另外两个管嘴一般连接着热流体回路，顺着该加热器同直径的管嘴继续追踪，可以遍历所有管程回路。将该回路标志为冷流体，用蓝颜色高亮。

壳程管嘴判断方法：可以由用户指定，也可以用以下算法确定。\label{shellflow}

按管程管嘴判断方法\ref{tubeflow}，在某个加热器得到管程管嘴后，另外一对管嘴是壳程管嘴，其中流体被冷却，沿着该管嘴流向继续追踪，最后应该可以追踪到一台泵或风机的入口管嘴。将该回路标志为热流体，用红颜色高亮。

如果管程和壳程管嘴判断正确，可以设置管嘴边界条件。

如果管程内部管道直径、长度、弯头直径、管道根数已知，可以根据这些并联管道得到管程阻力，或者从加热器厂家资料得到管程压力损失或局部阻力系数。

从加热器厂家资料得到壳程压力损失或局部阻力系数。
\subsubsection{在容器内部连接管嘴}
一般情况下，管壳式换热器内部管道没有被用户详细建模，因此，在管网分析软件中，提供了一个图形用户界面，用于设置管嘴在容器内部是如何被连接的，需要填写的信息有：内部连接管道的头管嘴号、尾管嘴号、管道根数、管径和壁厚、粗糙度或曼宁系数、管道长度、流量，容器类型如管壳式容器、混合式容器(使用管道等级STYPE字段存这个值)，设备类型如PUMP、VESS保存在设备模板等级表通用类型字段GTYPE。
\subsection{混合式换热器\label{bcmixing_heater}}
混合式换热器是依靠冷、热流体直接接触而进行传热的，这种传热方式避免了传热间壁及其两侧的污垢热阻，只要流体间的接触情况良好，就有较大的传热速率。故凡允许流体相互混合的场合，都可以采用混合式热交换器，例如气体的洗涤与冷却、循环水的冷却、汽-水之间的混合加热、蒸汽的冷凝等等。它的应用遍及化工和冶金企业、动力工程、空气调节工程以及其它许多生产部门中。

混合式换热器设置了排气口和排水口，参见 \ref{bcexhaust_vent}。

混合式换热器内部空间是连通的。

设置容器自身的内部空间为流体空间，流体空间可以是固体、流体互相作用的空间。

如果混合式换热器内部有两种互不溶解也不发生化学反应的流体，上下密度分别为$\rho_g,\rho_l$，其分界面标高为H1，设换热器管嘴最高标高是Hmax，对应总压为Pmax，另外一个管嘴最低标高是Hmin，对应总压为

$P_{min}=P_{max}+(\rho_l(H_1-H_{min})+\rho_g(H_{max}-H_1))g$

则根据管道流体流向，换热器出口管嘴应设置为管道入口或突然扩大，突然扩大小截面面积等于管道流通截面积，大截面面积可简化设置为换热器截面积或20倍管道截面积。类似地，换热器入口管嘴应设置为管道出口或突然缩小，类似地也按出口管嘴的处理方法计算截面积。

任一管嘴标高为$H_x$，对应总压为

$P_x=P_{max}+(\rho_l(H_1-H_x)+\rho_g(H_{max}-H_1))g,if H_x<H_1$，

$P_x=P_{max}+(\rho_g(H_{max}-H_x))g, if H_x>=H_1$

上面的边界条件设置方法有一个问题，即Pmax必须是一个已知量。为了避免设置这种边界条件中的Pmax，而要让程序自动计算出Pmax，需要将加热器模拟为一段管道。当然，最精确的计算方法是使用三维CFD计算设备内部的压力。
\section{容器设计软件}
容器设计软件有ASPEN EDR和HRTI，CoilDesigner,AutoPIPE Vessel,PV lite,CADWorx Plant。

中国开发的设备设计计算软件有SW6等。

各种三维机械设计软件如SolidWorks、UG、PROE、CATIA、CAXA等也可以设计容器，而且这些三维CAD软件才是设计容器的主力军。象SolidWorks、UG、PROE、CAXA、Inventor等已经能够很好地融合CAD与CAE，用户使用很方便。 
\section{Vessel模块总体目标}
AutoPDMS Vessel 模块(容器模块中文英文名称可以由张喆带领的团队自己讨论确定)的最终目标是，实现对任何容器的设计与计算，包括CAD模型的设计和CAE模型的前处理、计算、后处理。

Vessel容器模块是基于AutoPDMS CAD功能开发的容器设计软件，它也可以完成容器计算和设计优化，它的计算功能是基于AutoPDMS CAE功能开发的，并与AutoPDMS CAE/CFD紧密集成，可以实现工厂和设备系统仿真计算和优化。

用户使用Vessel模块，可以设计各种容器和换热器，包括各种管壳式换热器和混合式换热器。能够设计各种数量和各种型式的管程和壳程，自定义管子布局和各种隔板，自定义各种隔板的接触曲线及接触间隙实现泄露计算，能够计算磨擦损失和摩擦能量消耗及费用，能够设置各种设计和制造工艺的材料、零件、部件价格和装配价格，因而能够实现满足功能约束的费用最小的优化设计。

大致操作流程：使用Vessel设计各种容器，设计内部管路系统。调用CAE或CFD功能计算结构强度和流体温度、压力、能耗，或者计算最小价格获得最优设计。输出各种工艺图纸或CNC数控机床控制文件用于制造。

Vessel短期目标是满足CFD软件需求，中期目标是实现完善的容器设计，长期目标是为实现任意机械的三维设计和分析软件打好基础。
\section{CAE模块总体目标}
AutoPDMS CAE 模块的最终目标是，实现对任何模型的前处理、计算、后处理。

可以在AutoPDMS CAE模块选择AutoPDMS CAD模型，并对选择的模型设置边界条件，设置工况，计算各种工况下的参数，输出计算结果。

AutoPDMS CAE与AutoPDMS CAD紧密集成，利用AutoPDMS CAD实现建模和显示等前后处理，还可以直接调用AutoPDMS CAD 已有的功能设置参数，不写重复代码。如果AutoPDMS CAD现有功能不尽合理，可以被重构，使其服务于CAD和CAE。可以直接引用AutoPDMS CAD已经具有的管道应力分析功能。
\part{开发方案}
\section{软件架构设计}
软件架构设计非常重要。

AVEVA PDMS软件架构设计是比较好的，AutoPDMS也从AVEVA PDMS学到了一些精髓。

这两个软件的架构设计一些特点如下：

以导航栏GUI为核心，构建层次化域对象和事务。

持久层通用化。

层次结构数据库通用化。

事务操作通用化。

无论是管道、支吊架、HVAC、电缆桥架、建筑结构，所有设计过程基本按如下模式操作：

先建立属性库和元件库。

再建立等级库。

最后建立设计库。

有了属性库、元件库和等级库，软件操作流程如下：
\subsection{建立三维几何模型}
设计库事务基本就是在统一的层次结构数据库中插入专业元件，事务完成后就形成了设计产品的三维几何模型。
\subsection{设置边界条件\label{psabcs}}
得到三维模型后，需要进行计算分析。分析之前需要设置边界条件。对管道而言，主要是插入逻辑支吊架以及荷载信息。

逻辑支吊架是一种代表真实支吊架的符号，可以用比较形象和简略的三维元件表示逻辑支吊架，并存储在元件库。

因此，可以象插入管件一样在管道上插入逻辑支吊架。利用UEPSI代码，在AVEVA PDMS也可以使用该功能。

总之，插入逻辑支吊架代码与插入管件代码非常相似，数据结构也相似，但是逻辑支吊点存储在ATTA。
\subsection{分析}
分析是一个难点。之前AutoPDMS是依靠外部的AutoPSA程序来完成计算分析。
\subsection{建立三维支吊架模型}
完成分析以后，可以启动支吊架设计软件PHS3D，它从AutoPSA获得计算结果数据，存储在PHS3D数据库，然后可以在PHS3D根据管道应力分析结果选择支吊架元件型号规格。

得到支吊架元件型号规格，就可以在AutoPDMS象在管路上插入管件一样，在支吊架管理节点插入支吊架真实元件几何模型了，这时的支吊架元件尺寸是真实支吊架的尺寸，不是逻辑支吊架的符号表达了。但是插入支吊架元件代码仍然与插入管道元件代码很相似，即需要调用支吊架元件库、等级库，在设计库支吊架域对象写入支吊架数据，最后持久化。
\subsection{设置CFD边界条件\label{cfdbcs}}
高效率设置边界条件的流程如下：

首先搜索计算模型，自动设置边界条件。

如果无法完成自动设置，就需要提示用户手工设定边界条件。

手工设定边界条件，可以尽量提示设置位置和设置类型或相关信息。

可以采用与\ref{psabcs}相似的方式，设置CFD边界条件，即：建立CFD边界条件逻辑符号元件库，代表边界条件类型，例如入口、出口。

在必要的位置插入边界条件符号，输入边界条件数据。
\subsection{出图}
建立一系列基本二维图形元件，在二维线上插入这些二维元件，最后标注尺寸，就完成了二维出图。所以，DESI设计库软件代码也可以复用一部分到PADD二维图库。
\subsection{小结}
在AutoPDMS中，对于任何设置过程，均可以采用如下流程：建立基本元件库(2D或3D)，插入这些元件在需要的位置，设置这些元件的相关数据。

如果采用这种实现方式开发CAE，首先需要建立边界条件类型元件库。AutoPDMS现在已经建立了逻辑支吊架和一些约束的元件库。

这种实现的优点是可以在模型中可视化边界条件，缺点是这些可视化符号可能干扰用户视线。这种实现方式可能不适合在模型中绘制大量节点NODE和大量单元ELEMENT，尽管在abaqus中也是用一个红色小四边形或圆形符号表示节点，但是可能更适合用一个算法绘制这些四边形或圆形，绘制直线连接单元的边。
\section{前处理和计算GUI方案}
\subsection{GUI方案}
\subsubsection{仿照abaqus导航栏\label{gui1}}
仿照abaqus导航栏设计并实现AutoPDMS CAE GUI。使用该GUI可以完成类似abaqus导航栏的功能，能够在该界面完成模型的前处理、计算、后处理。

优点：
1，abaqus GUI已经有一些用户。
2，不需要绘制GUI图形，不需要构思GUI层次结构，节省了写GUI文档和构思的时间。
3，GUI需求很明确，只需要整理成文档即可在开发人员之间沟通。即使没有文档，开发人员也可以打开abaqus软件来在大脑中建立沟通信息。如果使用方案\ref{gui3}，只能靠两个人交流来沟通，而且由于没有文档，可能沟通错误。
4，其它。
缺点：
1，学习abaqus软件，理解其GUI需要时间。
2，由于现在不了解abaqus，不知道abaqus界面是否真的效率很高。
3，其它。

\subsubsection{仿照AutoPSA推荐工况GUI\label{gui2}}
现在AutoPDMS已经实现了一部分CAE功能，能够设置管道应力分析属性，例如支吊架、约束、附加力/力矩、附加位移/角位移、端点位移，设置温度、压力，设置推荐工况，并且可以自定义工况，导出应力分析数据，启动管道应力分析软件AutoPSA，计算选择的模型，在AutoPSA查看分析结果，输出结果到Word或Access，在AutoPDMS输出结果为ACAD图形文件.dwg格式。等等。

优点：
1，AutoPSA GUI已经有一些用户。
2，不需要绘制GUI图形，不需要构思GUI层次结构，节省了写GUI文档和构思的时间。
3，GUI需求比较明确，只需要整理成文档即可在开发人员之间沟通。即使没有文档，开发人员也可以打开AutoPSA软件来在大脑中建立沟通信息。如果使用方案\ref{gui3}，只能靠两个人交流来沟通，而且由于没有文档，可能沟通错误。
4，其它。
缺点：
1，学习AutoPSA软件，理解其GUI需要时间。
2，不知道怎样把AutoPSA推荐工况界面转换成step界面。
3，其它。
\subsubsection{根据现在团队的知识自定义PFA GUI\label{gui3}}
根据现在团队对AutoPDMS、AutoPSA、CAESARII、abaqus、ccx、cgx、CL32-win32的理解，自定义PFA GUI进行开发。
前一段时间可能就是这么做的。

优点：
1，不需要学习其它软件，只需要理解流体分析GUI的需求。
2，可以根据开发者的理解自由写step界面。
3，其它。
缺点：
1，PFA GUI没有用户，需要培训用户，用户是否真的很容易理解这些GUI。
2，需要绘制GUI图形，需要构思GUI层次结构，需要花很多时间构思GUI和写GUI文档。
3，GUI需求不太明确，不明确的需求很难整理成文档在开发人员之间沟通。即使有文档，开发人员也不可能打开PFA软件来在大脑中建立沟通信息，因为只有当PFA软件开发成功后，才能有稳定的GUI可以操作。
4，其它。
\subsubsection{其它GUI\label{gui4}}
采用其它方案写GUI。
\subsection{持久层方案}
如何处理AutoPDMS 现有的应力分析设置代码与管网流体分析代码持久层？有如下方案：
\subsubsection{增加CAE域对象，以满足CAE需求\label{persist1}}
不改AutoPDMS 管道应力分析模块现有代码，以保持与AutoPSA接口稳定。

另外重构一套与AutoPSA、CCX兼容的代码，既可以调用pipefem.dll和ccx.dll计算管道应力，也可以调用ccx.dll计算管网流体分析。

重构代码稳定以后，将全面取代旧的AutoPSA代码及其数据结构。最终将只维护一套新的重构代码，以节省劳力。

仿照abaqus层次结构实现CAE域对象，但不盲目照搬，而是有选择地优先实现一些必需的数据结构。
\subsubsection{兼容现在的部分CAE域对象\label{persist2}}
采用与AutoPDMS 管道应力分析模块现有代码兼容的数据结构和代码，实现管网流体分析事务和持久层代码。这是我们前一段时间采用的方案。
优点：
1，采用自定义属性stressInfo
\subsubsection{模仿现在的部分CAE域对象增加stressinfo\label{persist3}}
采用与AutoPDMS CAE现有代码不兼容的数据结构和代码，实现管网流体分析事务和持久层代码。
\subsubsection{其它持久层\label{persist4}}
采用其它方式写持久层域对象。
\section{计算结果域对象Datasets\label{datasetsDesign}}

Datasets即数据集，是指计算结果，是有限元方法的基本对象，在ccx中，它被表示在readfrd.h：

我们把dataset域对象节点放在CAE页面与Model同级，这样也许更便于展示计算结果，只要选择CAE页面的Model,step,bcs,就可以显示dataset内容。abaqus GUI不是这样布置的，它的结果页面被展示在另外一个称为结果的页面，也许是因为它输出结果内容展示形式更丰富多样，后文\ref{result} 将要介绍。
\subsection{Datasets GUI方案}
\subsubsection{仿照abaqus Result GUI\label{datasetsgui1}}
abaqus Result GUI功能很多，只能优先做一些必需的Result GUI展示结果。2019.07.07团队决定使用表格显示计算结果。

\subsubsection{仿照AutoPSA计算结果GUI\label{datasetsgui2}}
管道应力分析软件AutoPSA有比较丰富的计算结果GUI，已经为一些用户熟悉，如果能移植到AutoPDMS中，用户可以花较短时间学会操作CAE软件，对软件推广有利。但是，从前一段时间移植AutoPSA界面来看，移植难度是比较大的。

\subsubsection{根据现在团队的知识自定义计算结果 GUI\label{datasetsgui3}}
根据现在团队对AutoPDMS、AutoPSA、CAESARII、abaqus、ccx、cgx、CL32-win32的理解，自定义Result GUI进行开发。

\subsubsection{显示Result GUI\label{datasetsgui4}}
2019.07.05，谢新明在编写仿abaqus step界面时，提出一种改进load GUI:界面左边仍然模仿abaqus load gui，右边增加一个列表框，显示输入的所有Load，他认为这样很直观。表格gui的确有一些优势，可以显示大量数据，建议使用开源表格控件来做，写成通用类，适用于Load和BCs以及ParameterSet参数设置，也适用于显示Datasets。模仿例题有AutoPHS-主菜单-计算-支吊架生根结构构件强度计算-第1个表格控件，其中有带下拉框。

Datasets有很多的字段值，有固定的字段如节点号、工况号、时间，也有变化类型边界条件或参数值如温度、压力、流量、流速等，还有很多计算结果字段如力、力矩、位移、速度、加速度、应力、应变、压力、温度、电压、电流、热流量、功率、能量等。

可能需要显示datasets一个字段，也可能需要显示其多个字段，因此需要显示控制。这是计算完成后结果已经在域对象或持久层中的显示控制，而abaqus导航栏界面中output request输出请求是计算中控制输出到结果文件.dat或.frd的字段。这两种输出控制有一些区别，也有一定联系，但界面可以使用同样的代码实现。前者界面可以仿照ACCESS-主菜单-格式-取消隐藏列，后者界面仿照abaqus，但是可以写成同一个界面，控制的字段项目可以放在一个表中，该表字段有ID,输出字段,是否取消隐藏,输出控制步骤号，输出控制步骤号对应不同的输出控制阶段。

这个表格GUI方案可以适用于所有输入或输出GUI，包括但不限于BCs、Load、参数设置Parameterset、结果Datasets。

这种表格GUI方案大致如下：

在表格控件上方，设置一个按钮“取消隐藏列”，其GUI界面与消息响应完全模仿ACCESS-主菜单-格式-取消隐藏列。请搜索一些开源表格控件，可能很多控件已经具备上述功能，比如我曾经看到董浩找的一个c语言写的gtk控件gridcell，类似于一个电子表格，代码很少，功能相当强大，它曾经在项目启动会被董浩演示，可供参考。2019.07.06张喆下载了gridctrldemo源代码，是用mfc写的开源表格代码，功能很强，可以排序，复制，粘贴，只读，编辑，等。

在CFD模块导航栏也可以做其它gui，不使用表格控件。最好是结合导航栏与表格gui的各自优势，毕竟结果gui估计肯定需要表格gui，否则不可能展示大量结果。

难点其实在于如何构造一个通用类，满足显示表格要求。这相当于做一个access或excel，幸好可以参考AutoPDMS大量代码和各种开源office如libreoffice,openoffice,最简单的可能就是张喆找的那个gridctrldemo。表格显示也是一个很好的细分市场，有很多开源软件如paraview,tecplot甚至vtk都是在这个市场，不必说excel和access以及wps了。也可以自己再找一找其它开源简单电子表格。

\subsubsection{其它Result GUI\label{datasetsgui5}}
采用其它方案写Result GUI。
\subsection{datasets持久层方案}

\subsubsection{增加datasets域对象，以满足CAE计算结果域对象需求\label{datasetspersist1}}
不改AutoPDMS CAE现有展示AutoPSA计算结果代码，以保持与AutoPSA接口稳定。

另外重构一套与AutoPSA、CCX兼容的代码，既可以调用pipefem.dll和ccx.dll计算管道应力，也可以调用ccx.dll计算管网流体分析。

重构代码稳定以后，将全面取代旧的AutoPSA代码及其数据结构。最终将只维护一套新的重构代码，以节省劳力。

仿照abaqus层次结构中的datasets域对象，但不盲目照搬，而是有选择地优先实现一些必需的数据结构。
\subsubsection{兼容现在的AutoPSA datasets域对象\label{datasetspersist2}}
采用与AutoPDMS CAE现有代码兼容的datasets数据结构和代码，实现管网流体分析datasets事务和持久层代码。

\subsubsection{模仿现在的AutoPSA datasets域对象增加datasets\label{datasetspersist3}}
采用与AutoPDMS CAE现有代码不兼容的datasets数据结构和代码，实现管网流体分析datasets事务和持久层代码。
\subsubsection{其它持久层\label{datasetspersist4}}
采用其它方式写datasets域对象。
\subsection{datasets迭代目标}
\subsubsection{AutoPSA计算结果数据库}
CAESARII和AutoPSA导出的管道应力分析结果数据可以保存在ACCESS格式的计算结果数据库，可以在AutoPSA安装目录/PSA/Common Mdb/ShareRefInfo.mdb看到这种数据库的数据结构。

在该数据库加入必要的指针和字段即可存储CFD结果。
\subsubsection{实现dataset数据结构}
执行如下DDL语句可以建立dataset表：

CREATE TABLE dataset (Name char(50),Purpose char(20),ID integer, EnvID integer,ElementID integer,jobRef\_EnvID integer,jobRef\_ElementID integer,LcaseRef\_EnvID integer,LcaseRef\_ElementID integer,nodeRef\_EnvID integer,nodeRef\_ElementID integer,Value1 REAL,...,ValueN ValueType)

其中ValueX ValueType是伪代码，ValueX表示字段名，ValueType字段类型可以是REAL或任何其它有效字段类型。

\section{查看结果Result\label{result}}
CAE页面用于CAE模型前处理和计算事务。
在它的右边设置了结果Result页面，用于CAE后处理，例如查看Dataset域对象的内容。
\section{迭代实现的目标}
优先级顺序：管网流体分析、通用流体分析、管道应力分析、建筑结构分析、通用结构分析。管网流体分析为第1优先级，其它优先级顺序可能变动。
先按方案\ref{gui1}和\ref{persist1}写需求和设计，先写必需的域对象和GUI，如果最后写完了，确认没有需求误解和错误设计，可以按方案\ref{gui1}或\ref{gui3}写GUI，可以按任何一种方案写持久层。建议按\ref{persist1}写持久层。
\subsection{第1次迭代}
管网流体分析。
先按方案\ref{gui1}和\ref{persist1}写需求和设计，先写必需的域对象和GUI，如果写完了，确认没有需求误解和错误设计，开始编写代码，形成可以运行的内部测试版本(0.1版本)。
2019.06.22 谢新明完成了CAE功能需求规范总结书。团队会议讨论了该需求总结书。
2019.06.26 张喆完成流体分析功能设计规范书。
2019.06.05 团队会议讨论了功能设计规范书。选择的开发方案是按abaqus导航栏GUI做功能设计。
2019.06.05 张喆完成流体分析功能详细设计UML图。
2019.06.05 下午分工，做step详细设计：张喆负责BCs总体详细设计，谢新明负责输出字段请求和LOAD详细设计。因为现在只差step下面这些内存域对象了。

2019.07.07下午讨论了表格功能设计，每个人都写了设计在tex。开始做详细设计。定于2019.07.10下午讨论详细设计。
 
\subsection{第2次迭代}
如果开发团队觉得0.1版本不足以改善用户效率，可以按方案\ref{gui3}开发PFA GUI。此可以作为0.2版本。内部测试以后，再用户测试($\beta$测试)。
\subsection{第3次迭代}
如果用户觉得AutoPDMS CAE很好用，会提出一些新需求，开发人员分析这些需求，按优先级和开发难度排序，满足用户需求。
\section{阅读者}
AutoPDMS CAE设计人员。
\section{参考文档}
参见\cite{zhuyiwencyq} abaqus 6.12 导航栏以及《PDMS PROPCON 属性库参考手册11.6版中文版》\cite{ligb}等资料。

在AutoPDMS开发过程中，陈百炼写了比较详细的管道应力分析模块设计规范书，详见：\textbackslash \textbackslash Systemuk\textbackslash E\textbackslash VC\textbackslash AutoPDMS9.0-Document\textbackslash 开发文档\textbackslash 应力分析\textbackslash 插入支吊架\textbackslash 设计规范书2.doc

\part{节点层次}
为了清晰表示AutoPDMS CAE域对象之间节点层次关系，把描述导航栏顶级节点的文字分级写成章。
\section {Models}
与Models同一层次的节点有Annotations、Analysis、Datasets。
\section {Annotations}

\section {Analysis}
\subsection {Model-1}
Models下面有一个节点显示模型信息，标题是模型名字，例如Model-1。应该实现它。
再下一层有如下节点，我不了解有些节点。
它下层全部节点如下：

\subsubsection {Parts}

\subsubsection {Materials}

\subsubsection {Calibrations}
\subsubsection{Sections}
sections记录元件的截面特性，包括几何特性和材料。

Sections域对象存储截面特性FLUID SECTION卡的数据。数据结构比较复杂，与元件类型有关。

在AutoPDMS CAD建模时已经设置了几何特性，选择分析模型后搜索到截面特性并更新到sections域对象。

模型搜索程序可以设置sections域对象大部分截面几何特性。用户可以修改截面特性的阀门开度和曼宁系数，截面固体材料和流体材料。

\subsubsection{Profiles}

\subsubsection{Assembly}
为了文字层次清晰，把Assembly写成单独章。

\subsubsection{Steps}

\subsubsection{Field Output Requests}


\subsubsection {History Output Requests}

\subsubsection {time Points}

\subsubsection {ALE Adaptive Mesh Constraints}

\subsubsection {Interactions}

\subsubsection {Interaction Properties}
\subsubsection {Contact Controls}

\subsubsection{Contact InitializationsIa }

\subsubsection{Contact Stabilizations}

\subsubsection{Constraints}

\subsubsection{Connector Sections}

\subsubsection{Fields}

\subsubsection{Amplitudes}

\subsubsection{Loads}

\subsubsection{BCs}
.
\subsubsection{Predefined Field}

\subsubsection{Remeshing Rules}

\subsubsection{Optimization Tasks}

\subsubsection{Sketches}



\section{Materials}



\section{Assembly}
为了文字层次清晰，把Assembly写成单独章。

Assembly下有如下子节点。
\subsection{Instances}
参见单独章\ref{instancesChapter}Instances
\subsection{Position Constraints}
\subsection{Features}
\subsection{Sets}
Sets节点下有Nodesets节点集，Elementsets单元集。选择分析模型后搜索程序填写nodesets和elementsets节点记录。

\subsection{Surfaces}
\section{Instances\label{instancesChapter}}
\subsection{branches}
\subsubsection{Nodes 节点域对象}

Nodes即节点，是有限元方法的基本对象，在ccx中，它被表示在readfrd.h：

typedef struct \{

int   nr;              /*   external node-nr (node[node-indx].nr) */

int   indx;            /*   node-index (node[ext-node-nr].indx)   */

char  pflag;           /*   1 if used for display purposes    */

/*  -1 if the node is deleted          */

/*   0 default                         */

double nx;             /*   coordinates  node[ext-node-nr].nx */

double ny;

double nz;
\} Nodes;

\subsubsection{Elements 单元域对象}
Elements即单元，是有限元方法的基本对象，在ccx中，它被表示在readfrd.h：

typedef struct \{

int nr;                /* external element-nr */

//  int indx;              /* -index (elem[external elem-nr].indx)   */

int type;              /* element type (1:Hexa8)  */

int group;

int mat;

int attr;              /* -1: unstructured mesh tr3u (-2 for mesh with libGLu tr3g ) */

/*  0: default           */

/*  1: reduced integration he8r he20r */

/*  2: incompatible modes he8i */

/*  3: DASHPOTA be2d */

/*  4: plane strain (CPE) tr3e tr6e qu4e qu8e */

/*  5: plane stress (CPS) tr3s */

/*  6: axisymmetric  (CAX) tr3c */

/*  7: fluid he8f */

/*  8: tet10m */

int nod[27];

double **side;         /* side[Nr.][x|y|z]== normal vector */

\} Elements;

\section{steps}
step,即不同工况，模型能设置多种step，step中设置不同边界条件以及输出设置。如果设置多种工况，可以右键选择当前选择哪种工况计算。

Output

Manning

BCs

\subsection{输出要求 }

输出要求：用户按照需要，设置输出的数据类型如流量，位移等。即提供给CCX计算的inp文件的*node print与*node output字段。

\subsubsection{使用方案: 显示输出要求}
1.点击Output，显示输出要求

2.提供设置输出请求功能 

\subsubsection{功能需求: 显示输出要求}
1.点击Output，显示输出要求

2.提供设置输出请求功能 

\subsection{曼宁系数 }
曼宁系数：管道流体分析时，每个管道都需要设置曼宁系数。

\subsubsection{使用方案: 显示曼宁系数}
1.点击Manning，显示曼宁系数

2.提供设置曼宁系数功能 

\subsubsection{功能需求: 显示输出要求}
1.点击Manning，显示曼宁系数

2.提供设置曼宁系数功能，针对模型中所有曼宁管道，都能设置曼宁系数，提供一个选择框，用户选择后该模型所有曼宁管道都默认为该曼宁系数。

\subsection{边界条件}
\subsubsection{功能需求: 流体设置}
右键创建边界条件时，能自动定位到管件或者管道，弹出界面进行设置，设置完成以后，可以转到下一个出入口进行设置，

\subsubsection{功能需求: 结构设置}

BCs是边界条件BoundaryConditions的集合。它与模型数据库类型有关。

当选择通用计算时，即eMyCAEModelType=eCAEModelType.eCMTStandard，此时应该提供一系列的BC类型给用户选择，这些类型有：

固定支吊架FIX或ANCOR

当选择CFD计算时，即eMyCAEModelType=eCAEModelType.eCMTCFD，此时应该提供一系列的BC类型给用户选择，这些类型有：

inlet

outlet

...

如果在interactions节点选择了流固耦合FSI作用，则要把流体BCs类型和固体(即通用计算)BCs类型都提供给用户选择。

\subsubsection{BCs域对象数据结构}
执行如下DDL语句可以建立BCs边界条件表：

CREATE TABLE BCs (Name char(50),Purpose char(20),ID integer, nodesetRef\_EnvID interger, nodesetRef\_ElementID interger,DOFfirstID integer,DOFlastID integer,value REAL,EnvID integer,ElementID integer)

按abaqus表示法，使用BCs域对象表示边界条件。

避免与AVEVA PDMS 11.5定义的BOUNDARY域对象冲突。详见H:\textbackslash AVEVA\textbackslash Pdms11.5.SP1\textbackslash manuals\textbackslash pdms1151\textbackslash man31\textbackslash doc1.pdf 第11页设计数据库层次：

Ground Model Element (GRDMODEL)
现场的基本形状和特征可以通过地面模型来表示。 这些可能是土堆或斜坡等自然现象。 每个地面模型元素的构建方式与其他地方描述的POHEDRON（多面体）完全相同。 对地面模型形式的限制意味着它们的用途有限。
复杂的表面轮廓更好地通过包含任何基本形状的“虚拟”结构来近似。

Site Boundaries and Roadways Element (BOUNDARY)
对于诸如栅栏和道路等场地布局功能，通常将建模限制为布置在曲面上的线和弧线就足够了。
BOUNDARY元素允许这种建模方法，通过定位成员POINTS，IPOINTS（不可见点）和TANPOINTS（切点）来描述所需的轮廓。 BOUNDARY可以被认为是一个“高级”基本元素（它的相同的低级别等价物是DRAWING，它可以属于EQUIPMENT，STRUCTURES等）。 BOUNDARY具有基元的正常绘制LEVEL属性，但没有OBSTRUCTION（因为它完全由线组成）

\section{Analysis}
Analysis下有4个子节点：

Jobs

Adaptivity Processes

Co-executions

Ootimization Processes

\subsection{Jobs}
jobs节点管理job的建立、修改、更新、删除，并实现计算过程管理。


\begin{figure}
	\includegraphics[scale=0.5]{abaqusResult.png}
	\caption{Abaqus查看结果页面}
\end{figure}

顶级结点有：

Output Databases

Model Database (1)

Spectrums (7)

XYPlots

XYData

Paths

Display Groups (1)

Free Body Cuts

Streams

Movies

Images

同样的，我们把顶级结点描述文字分级为章。

\section{Output Databases}
以下章描述输出数据库节点层次。
\section{Model Database }
\subsection{Model-1}
\subsubsection{Steps (1)}
Initial
\subsubsection{Instances}

\section{Spectrums (7)}

\subsection{Black to white}

\subsection{Blue to red}

\subsection{Rainbow}

\subsection{ Red to blue}

\subsection{Reversed rainbow}

\subsection{White to black}

\subsection{Wrap around}
\section{XYPlots}

\section{XYDataB}

\section{Paths}

\section{Display Groups (1)}
\subsection{All}

\section{Free Body Cuts}

\section{Streams}

\section{Movies}
\section {Images}
\part{功能需求总结}
\section{启动}
\subsection{选择CAE模型数据库类型}
启动abaqus以后，显示启动对话期Start Session对话框，有三个按钮可以建立模型数据库(Create model Database)：

With Standard/Explicit Model(使用标准/显式模型，用于一般的计算)

With CFD Model(带有计算流体动力学模型，用于流体计算)

With Electromagnetic Model(带有电磁场模型，用于电磁场计算)

选择不同的模型，可能影响BCs等的设置，例如选择流体模型后，BCs下多了inlet和outlet，约束的类型也有一些变化。
\subsubsection{实现}
使用一个枚举类型标记选择模型数据库类型eCAEModelType，在设置BCs或Constraints时根据eCAEModelType提供不同的BCs类型给用户选择：

enum eCAEModelType
{
	eCMTStandard=0,//结构计算
	eCMTCFD=1,//CFD计算
	eCMTElectromagnetic=2,//电磁场计算
}

使用一个枚举类型标记各专业模块eCAECategory，根据不同的eCAECategory选择不同的CAE模块界面：

enum eCAECategory
{
	eCCAbaqus=0,//进入通用界面仿abaqus界面
	eCCPFA=1,//进入管网流体分析界面
	eCCPSA=2,//进入管道应力分析界面AutoPSA或CAESARII
	eCCSSA=3,//进入结构分析界面SSA或仿SAP2000
	eCCPKPM=4,//进入结构分析界面仿pkpm
	eCCStaad=5,//进入结构分析界面仿Staadpro
	eCCAnsys=6,//进入结构分析界面仿Ansys
	eCCFSI=7,//进入管网流固耦合FSI分析
	eCCFSI3D=8,//进入三维流固耦合FSI分析
	eCCHeater=9,//进入换热器设计和分析
	eCCMotor=10,//进入电机设计和分析界面
	eCCpump=11,//进入泵设计和分析界面
}

\subsection{进入abaqus界面功能模块}
如果输入CAE命令，会设置eMyCAECategory=eCAECategory.eCCAbaqus，此时应该先选择eCAEModelType类型。这样就会在AutoPDMS导航栏设计库模块页面右侧加入CAE页面，CAE页面GUI元素与abaqus导航栏完全相同。如下：

abaqus导航栏有许多节点。考虑到完全实现abaqus导航栏所有节点需要很多工作量，列出了一些必须实现的节点，不实现这些节点，并输出其值，就不可能得到正确计算结果。
\section{表格需求}
*****2018-12-06修改：创建一个通用的表格对话框，这个对话框可用于设置边界条件、Step以及显示结果。设置不同类型的边界条件，需要设定不同的数据，但是可以利用同一操作来选择合适的边界条件对象，即仿照Abaqus操作方式在模型中操作鼠标获取对象，既可以获取点也能获取单元集，这些对象作为一个属性被写入到实例化的表格(边界条件设置表格)中，之后可以继续为这个对象设置数据，表格的表头是下拉框，可以设定对象的类型(出入口、固定约束等)，之后表格自动筛选隐藏列，只显示需要设置的参数列，完成后，继续下一个对象设置，不同对象类型会出现不同的隐藏列，初始化时全部类型参数一次性加载。

设置Load方式与设置边界条件一样，实例化对应的Load表格，点击鼠标获取模型对象后，只要在下拉菜单下选中荷载类型，隐藏不相关的列，接着是设置数据。

无论是边界条件还是Load，直接操作模型对象，表结果存储对象是对应的数据库表，这个通用表格应该具备的功能有：隐藏列、新增行、修改数据、删除行，表头下拉、排序。
\begin{figure}
	\includegraphics[scale=0.5]{TableRequest}
\end{figure}
\section{模型需求}
模型、装配、实例、分支是abaqus导航栏的一些关联层次节点。是否要在AutoPDMS CAE全部实现这些节点？

如果不全部实现，是否能够满足未来需求？

如果全部实现，显得比较繁琐。在每一个层次节点都要实现如下操作：
建立Create、读取Read、更新Update、删除Delete。在CRUD操作中，是否允许一些复杂的引用操作，如下。
\subsection {允许节点引用同级其它节点}
\subsection {允许节点引用高级其它节点}

\part {用例}
\section{CAE界面}
\subsection {使用方案：显示流体分析界面}
1.点击菜单：模块-流体分析，显示流体分析导航栏界面

2.或者输入命令：选择数据库模型类型SMT

3,选择数据库模型类型-流体分析类型后，显示流体分析导航栏界面

4.输入命令->PFA->显示流体分析导航栏界面
\section{Material材料}
\subsection{使用方案：显示材料特性 }
显示材料特性：根据介质温度、压力显示相应温度下的属性。

\subsection{使用方案：自定义材料功能}
右键菜单自定义材料，调用CustomMaterial.dll动态库显示自定义材料对话框。

右键菜单不太方便，也可以仿照AutoPSA单元数据输入页面材料特性选项按钮后面跟一个自定义材料按钮，便于操作。

因为较少使用该功能，可以放它到主菜单。
\section{sections截面特性}
\subsection{使用方案：显示截面特性 }
在Abaqus中，先定义材料再定义截面属性，然后可以为截面属性分配材料，截面属性可以沿着分支传播，除非截面属性被修改。对于结构和耦合计算分析仿照Abaqus利用模型交互方式实现定义截面特性的方法，在点击截面属性这里应该提供一些功能:
指定流体材料；
显示该截面介质温度下材料特性；
考虑到用户之前使用过的比如abaqus、REVIT等软件的习惯，如果对某个截面设置了材料，完成了截面属性操作，当点击该截面属性时需要在模型的几何结构对应位置高亮显示。
\section{参数设置}
无论管网流体分析还是三维流体分析，只设置一次参数。边界条件自动引用这些设置参数。参见\ref{parameterset}。
\part {功能设计}

\section{使用方案}
流体分析模块$\rightarrow$右键点击设备弹出菜单$\rightarrow$选择换热器设计$\rightarrow$参数设置$\rightarrow$自动生成模型并分析
\subsection {功能设计: 设置参数}
设置参数界面的设计

设计：以调用AutoPDMS中新建管道的对话框为基础，加上其他需要设置的参数，包括管间距，排列角度，管程数，管道长度，布管圆直径等，其中某些参数如布管圆半径根据管间距以及其他数据自动填入，用户也能手动设置。
\subsection{功能设计：生成管箱模型}
用户在设设置参数界面设置好后，根据参数，新建ZONE节点并在下面新建设备节点，首先画两个布管圆大小的平行的薄圆柱体，之间的距离为管道长度。类型为U形管时除外。然后根据用户设置的管程类型，在两端加上对应的薄长方形的管板。管板参数可以新建一个类保存，各个管程类型有特定的管板参数，也可以由用户手动设置，画管板时只要调用这个类就可以了。用户手动设置的功能暂不提供，只是为了以后兼容。

ligb：建议使用设备模板做界面来设置参数。设备模板界面中有图形可以指定管嘴、管板、管子等位置，以及管子长度等，以及两侧的管箱布置模板。

两个管箱的模型一般不相同，
管箱和管道怎么相连？
管箱内是用分割好的几个模型还是整体的加上几个管道隔板？
1.如果使用分割好的模型，AutoPDMS中没有弧形体，无法实现
2.采用管道模板的话，用户怎么看到管箱内的情况——管箱部分的外壳不画，管箱与换热管连接的地方使用一块较薄的圆板，管板与圆板相连，换热管也与圆板相连。 但是这种模型怎么放到模板中？

ligb:

写一个空间连通域识别算法A。调用这个算法A即可获得管子的连通性。算法A由一些开源的计算几何算法组成，主要包括如下几个子算法Bi：B1-根据封闭空间域S中的各实体Pi，确定封闭空间S的表面集合Fi以及这些面Fi的顶点Vi和边Ei。B2-根据B1得到的Fi、Vi、Ei信息，确定一些面的闭合边，这些边形成了闭合的二维连通域Di。B3-根据管子在管板的入口中心点Tj与Di，计算管子是否属于Di，如果属于Di，则管子属于管箱连通域。这些算法Bi都可以从开源计算几何算法库CGAL或其它几何库得到。

是否需要管嘴？

ligb:需要管嘴。请建立几个标准小管径的管嘴元件库。

\subsection{功能设计：生成管道模型}
首先根据用户选择的参数，在布管圆中确定各个管道的位置，然后在ZONE节点下新建PIPE节点并将管道作为BRANCH在下面画出来。

布管位置不知道如何确定
所有管道是否需要都画出来？  管道除位置不同以外，其他都相同。都画出来的话，可能有上千个分支，显示在设计库树形导航栏中可能不太适合。

ligb:

都画出来。
因为要形象表示就要画出来。另外，只有画出来，调用导出inp即可计算，不用修改导出代码。
除非实际画出来速度太慢，才会使用另外的代码。

U形管类型如何画管道？

ligb:
按U形管转弯180度，转弯直径为U形管间距，这样才不会碰撞管子。
\subsection{功能设计: 换热器管程流体分析}
在模型画出来后，将模型转换为INP，并输出到文件中，调用CCX进行分析。管箱与管道之间使用多个起始位置相同的大小头相连。

管箱转换为什么样的INP单元，参数如何设置?

ligb：
1，管箱转换为水库单元是否可以？水库可以设置水位，管箱也可以设置水位，但水库上部压力是固定的，所以不合适转换为水库单元。除非管箱内部压力是恒定的。
2，使用任何节点模拟，就像张喆做的练习例题那样，只要在该节点设置水位，设置初始压力温度，即可。管道入出口使用突然扩大或缩小模拟。这种模拟方法是目前可行的方法。
3，使用ccx自定义功能，开发一个管箱节点，在1的基础上编码使压力可变。这个功能留待以后做。
4，可能还有更简单的方法暂时未被我们理解。
5，其它方法。

\section{Models}
\subsection {功能设计：显示模型域对象}
模型的选择与添加：3种方式：ACAD命令PFA，设计库右键菜单PFA管网流体分析，在CAE导航栏直接点击模型添加或修改。

用户在设计模块中输入命令并选择完管道模型后，切换到流体分析模块并新建一个对象CFD，即Abaqus中的模型；同时将管道模型划分好节点和单元；并在节点下自动生成以下必需节点：Material，Assembly，Steps，然后在子节点下自动生成一些节点和数据。用户还可以点击模块，选择流体分析模块，查看之前进行的分析。

右键新加功能(这个功能给开发者调试程序查看inp文件比较方便，建议使用一个不开放给最终用户的内部命令如debugInp来查看inp文件，不要呈现给最终用户)
编辑关键字，用户可以查看Inp文件，看那些条件已经设置好了。节点和单元可以不要显示。(最终用户应该是需要看所有节点单元等全部输出信息，但开发人员可以只看step等，不看节点或单元，以免信息太多干扰调试)

节点表跟单元表 也用table表显示出来

建议尽量使用域对象传递数据，尽量减少查看文本文件。
\subsection{Material}
\subsubsection {功能设计：显示材料设置（Material）}
仿照AutoPSA实现材料功能，直接调用材料的对话框。

右键点击Material节点，出现菜单栏：添加材料，点击添加材料后弹出AutoPSA的材料对话框，只需要在对话框中添加确认，取消按钮。点击确认后在Material节点下新建一个详细材料节点如material1(建议保存到材料名属性库Propcon-world-matw-SOLI或FLUI节点，同时也保存在AutoPSA材料库)，但是节点名称不能取材料的名字，因为AutoPDMS中节点名称不能名字相同，假如用户不同模型中需要添加相同材料则会冲突。

右键点击详细材料节点如material1节点出现菜单栏：查看特性。用户可以通过这个查看材料特性或是对数据进行修改。(请描述详细材料节点如何与边界条件中设置的温度联系，显示对应节点下对应温度值的特性)
Material域对象中的属性应该包括各种分析中所需要用到的属性。当属性对温度依赖时，读取保存时可以仿照stressinfo将属性的数据类型设为字符串类型。(此属性温度依赖代码如何通用于管道应力分析和管网流体分析？目前看起来似乎是不能通用，只能单独写。因为PSA材料属性输出到.psa文件里依赖于单元和温度，而PFA输出在inp文件里只依赖温度。不过，还是可以统一的，因为在输出到文件之前还是可以让属性依赖于温度和单元或sections)。
\subsubsection{功能需求: 自定义材料命令菜单}
1.提供自定义材料右键菜单

已经在管道应力分析软件AutoPSA实现了自定义材料功能，代码在ShareDLL库下的一个动态库CustomMaterial.dll，添加材料时要选择规程，建议选择ALLCODE(内部规范号为0)，AutoPDMS CAE代码调用它获取材料时也要从ALLCODE规范取值，即，添加的材料和获取材料特性必须用同一个codeid。如果不能保证这两个codeid同步，就不能获得正确的材料特性。详见 材料特性库CustomMaterial.vcproj。
\subsection{Sections截面特性}
\subsubsection {功能设计: 显示截面特性（Sections）}
\subsubsection {功能设计: 显示各种参数（ParameterSet）\label{parameterset}}
如何设置和显示各种参数，如曼宁系数(TYPE=1)、粗糙度(TYPE=2)、阀门开度(TYPE=3)、任何可能需要设置的值(...)。

可以用一个通用域对象ParameterSet存储这些值，ParameterSet数据结构：ID,值类型,值数据，引用。这些值的类型包括但不限于：曼宁系数(TYPE=1)、粗糙度(TYPE=2)、阀门开度(TYPE=3)、水位、温度、压力、流量、任何可能需要设置的值(...)。引用是指这个值作用在哪个单元集或节点集。

ParameterSet域对象可以放在Sections下，也可以放在branch下，或者step下。

ParameterSet下级节点，可以是值类型，也可以是引用的类型。

ParameterSet域对象存储了参数设置信息，可以在1D或3D分析模型BCs域对象引用这些信息。这避免了在管网流体分析模型和三维流体分析模型中重复设置边界条件。参见\ref{parametersetDiscussion}。

如果用BCs来取代ParameterSet，就失去了上面这个优势。
\subsection{Assembly}
\subsubsection {功能设计: 显示模型装配（Assembly）}
用户在选择完模型并新建对象CFD时，在CFD下自动生成Assembly节点的同时，在Assembly节点下新建Instances，Sets两个节点。在Instances节点下为选择的管道模型每个分支新建一个对象Branch（名称待定）。branch下新建nodes节点域对象包含划分好的节点信息，新建Elements域对象包含划分好的单元信息。

ParameterSet域对象用于保存参数。可以使用如下GUI设置参数，保存参数在ParameterSet。

新建一个Equipmentsets存储每个设备(目的是为了查找设备管嘴，定位出入口，因此似乎还要在equipmentsets节点下新建一个nozzlesets管嘴节点表。
似乎还要加一个tube或elbow/bend域对象用于设置曼宁系数和粗糙度，一个Valve域对象用于设置阀门开度，这两个域对象也可以加在sections域对象或BCs域对象下，也可以专门设置maning域对象、AbsoluteRroughness粗糙度域对象、ValveOpening阀门开度域对象存储相关值，也可以用一个通用域对象ParameterSet存储这些值，ParameterSet数据结构：ID,值类型,值数据，引用。从ParameterSet数据结构看，可以用BCs来取代ParameterSet，但是BCs有固定的一些类型定义，如果忽视BCs这些固定的类型定义，BCs完全可以取代ParameterSet)，对象中包含它所对应的分支或设备的引用。

Sets下自动生成Nodesets节点集，Elementsets单元集两个节点。

关于节点与单元信息的保存，有如下方案：
1．所有节点和单元都新建一个对象存储。优点：能够使用AutoPDMS域对象代码实现仿照abaqus层次结构。

缺点：
1.1 不兼容AVEVA PDMS结构(目前知道能使用类似于自定义属性stressX，这里的X代表一些字符串如Info、Force、Hanger、Res、Disp、Cold、Info\_Tube、MediumF\_Tube，这些stressX字段都是AVEVA PDMS节点ATTAch的自定义属性UDA，是否能够自定义节点需要研究其LEXICON模块，估计不行)

1.2 节点和单元的数量可能过多，不便于用户查看。

2．所有节点和单元的信息都放到一个字符串中，存放到Nodes，Elements域对象的某个属性中。缺点：

3.  节点和单元信息存放到管件的某个属性例如stressX中。优点：stressX是AutoPDMS已经定义的属性，并且已经使用UDA在AVEVA PDMS实现。

4. 节点和单元信息存放到ATTAch的某个属性例如stressInfoX中。优点：ATTA是AVEVA PDMS和AutoPDMS的内置节点，兼容性好，以后软件很容易与AVEVA PDMS接口，扩大市场。

5. 如果节点和单元可以存放在属性中，那么其他对象如各种参数、各种load、各种BCs都可以存储在属性中。这也就是AutoPDMS管道应力分析模块已经采用的方案。但是AutoPDMS管道应力分析模块没有采用导航栏方式管理它应该管理的对象，而是采用菜单和命令来管理对象，不过它现在重构了图形化模块，可以图形化管理一部分管道应力分析模块域对象，操作比较方便，已经超过了AVEVA PDMS，但是否超过了abaqus？感觉AutoPDMS管道应力分析模块图形化部分可能已经超过了abaqus，但导航栏部分落后于abaqus。

关于参数设置问题，应该满足如下需求：

如果移除了选择的模型，但没有删除设计库的模型，那么不能删除设置的参数，以免下次选择模型后要重新输入设置参数和BCs/LOAD/Output Request。如果要实现这种需求，可以在选择和移除模型事务中写相关代码处理。

如果选择了1D管网分析和3D CFD分析，如何保证不需要重新设置边界条件就可以继续分析？这可能需要abaqus另外一个域对象Surface，并添加另外一个新的BREP对象，BREP是所有CAD模型都已经实现的域对象，包含顶点Vertex,边Edge，面Surface，体Volume，能够根据surface所包含的V，找到对应的BCs。

看起来，是需要ParameterSet域对象\ref{parameterset}和Surfaces域对象。

实现ParameterSet域对象，有多种方式：

如果与AutoPDMS管道应力分析模块和AVEVA PDMS兼容，可以改ParameterSet名为stressX，存储到ATTAch节点的同名属性中。它的优点是与之前软件兼容性好，与AVEVA PDMS兼容性好，可能扩大市场。

如果不考虑兼容性，可以写成层次化域对象。

如果开发团队暂时不知道怎么实现这些需求，就按你们自己的想法先实现已经理解的需求，这样避免干扰你们的思路。注意脑海中要始终保持思考如何实现这些需求，一旦有方法，就尽可能早重构代码，提前重构比以后重构可以节省很多成本。节省的成本如何体现价值？体现在以后的重复使用中：如果以后有做三维CFD或结构分析的团队，他们使用了你们的代码，那么他们就会节省成本，他们的开发投资就下降了，而如果他们的收入很高，他们就应该贡献一部分收入给你们开发的这些公用代码。投资只影响初始定价高低，定价高了卖不掉，就要打折，打折之后，定价下降了，就会反映出真实绩效，真实绩效是由代码和市场需求决定的，市场需求本来就小，代码质量再怎么高，也不可能获得高的收益。代码质量很差，市场需求再怎么大，客户也不可能选择很差的产品。

在我们集团和UESOFT内部，也遵循同样的原则。一方面是要尽量写高内聚低耦合高质量的代码，另外一方面要尽量做市场需求大的产品，或者说尽量用通用的代码满足尽可能广泛的市场需求。这就要求不断重构，创造好的代码架构，高内聚，低耦合，少BUG，高稳定，满足尽量多的市场需求。当然，这是一个不断循环迭代的过程，不可能一蹴而就，大家要准备打持久战，也要准备尽快推出满足用户最小需求的第一个版本。这是一对矛盾。处理好这些矛盾，就是处理好长期与短期、开发与市场的平衡。

Node域对象中包含节点编号，节点坐标。

Element域对象中包括该单元所包括的Node对象的ID，单元对应的管件。

nodesets域对象包含节点编号数组。

elementsets域对象包含单元编号数组。

nodesets和elementsets需要保存。

nodes和elements需要保存。

单元信息是否需要保存？即边界条件是否保存到单元中。边界条件保存在BCs域对象。
\subsubsection{branch下有Node节点域对象}
我现在不了解AutoPDMS和AVEVA PDMS如何管理大数据库，后者好像是可以把大型工程存储在三位数编号的项目中，例如，SAM工程的数据存储在SAM000目录下，如果数据量很大，还可以把一部分数据存储在SAM001,SAM002,...等目录下。

有2种方案存储AutoPDMS Node，用一个node表存储节点可以简化代码，用多个node表存储节点可以加快查询速度。

执行如下DDL语句可以建立node表：

CREATE TABLE node (Name char(50),Purpose char(20),ID integer,Origin\_X double,Origin\_Y double,Origin\_Z double,EnvID integer,ElementID integer,BranchRef\_EnvID integer,BranchRef\_ElementID integer,CatRef\_EnvID integer,CatRef\_ElementID integer)
\subsubsection{branch下有Element单元域对象}
执行如下DDL语句可以建立Element表：

CREATE TABLE Element (Name char(50),Purpose char(20),ID integer, member memo,EnvID integer,ElementID integer)
\subsubsection{sets下有nodeset节点集域对象}
执行如下DDL语句可以建立nodeset表：

CREATE TABLE nodeset (Name char(50),Purpose char(20),ID integer,member memo,EnvID integer,ElementID integer)
\subsubsection{sets下有Elementset单元集域对象}
执行如下DDL语句可以建立Elementset表：

CREATE TABLE Elementset (Name char(50),Purpose char(20),ID integer, member memo,EnvID integer,ElementID integer)
\subsection{steps}
为了清晰描述step功能设计，单独写一章。参见 \ref{stepfeature}。
\section{steps\label{stepfeature}}
Steps节点下不同Step代表不同工况，用户进行分析时，首先需要右击Steps，显示菜单栏：新建Step，选择新建后，弹出Step设置框，顶部有四个对话框切换栏，包括输出请求，载荷，边界条件，基本条件。每个对话框对应一个域对象。
\subsection{功能设计: 显示输出请求（Output Request）}
输出请求（OutputRequest）即用于CCX计算的Inp文件中Node print和Node file关键字中需要设置的信息，对设置进行描述后提供给用户选择。

输出请求与载荷域对象中所需要保存的属性就是需要写到inp文件中的数据。
\subsection{功能设计: 显示载荷（Load）}
载荷（Load）即INP文件中的Load字段，包括重力信息等，同样将其通俗化后让用户设置。
\subsection{功能设计: 显示参数设置(ParameterSet)\label{parameterset}}
使用设置参数(ParameterSet)域对象，可以设置曼宁系数，粗糙度，摩擦系数，水位，阀门开度等参数。
该域对象数据结构为ID,值类型，值数据，引用。

可以为每个管道设置曼宁系数，可以仿照AutoPSA的前后查找功能逐个元件设置，并提供传递或修改功能，之后相同截面的所有曼宁系数都会默认为当前的曼宁系数，一旦该系数被修改，则传递(propagated)停止在该截面。如果后面又出现了新截面的曼宁系数，则新系数继续传播到截面改变为止。

同样的，可以为每个阀门设置阀门开度。
\subsection{功能设计: 显示边界条件（BCs）}
在BCs节点下可以为管道模型中的所有出入口设置温度，压力，流量。其中，在力学计算中，压力、流量为互斥对象，只能2选1，但在热力计算中，压力、流量不是互斥对象，可以同时选择，这时它们和温度是互斥对象。可以仿照AutoPSA的前后查找功能逐个元件设置边界条件。保存BCs与保存参数相似。当用户选择节点以后，能高亮节点。

***边界条件设置对象是节点，需要找到对应的出入口节点ID，但是管网分析节点号也很多，如果前后查找是否会耗时较多？我的建议是在选定模型后，就应该搜索出所有的出入口，并提供对应的节点号，当进行边界条件设置时，只需要对这些搜索出来的节点进行设置即可。-----谢新明
\section{关于参数设置的方案讨论\label{parametersetDiscussion}}
有多种方案可以设置参数。根据参数的数据结构来看，可以按值类型分门别类列出节点如曼宁系数、粗糙度、阀门开度，也可以按引用的元件类型列出节点，如阀门、大小头、直管、弯管、泵、换热器。按引用类型列，参数节点放在branch或sections节点下比较好。按值类型列，参数节点放在steps下比较好。参见\ref{parameterset}
\section{analysis}
\subsection{jobs}
\subsubsection {功能设计：显示Jobs对象}
在Analysis节点下新建Jobs节点，当用户想要进行分析时，在Jobs节点下右键选择新建Job，弹出Job设置对话框，用户可以在此处选择Steps中设置的Step。选择后，通过对Job节点右键选择计算即可将本次Job中的所有设置写入到inp文件中，并将文件传递给CCX进行计算。

AutoPDMS中右键点击导航栏中的节点，显示的菜单是同一个，可以通过菜单栏中设置相同的名称，不同的域对象中写对应的事件。
\section{datasets或Result}
参见\ref{datasetsDesign}。
\subsection {功能设计：显示结果}
在Datasets节点下新建节点，等用户计算完成以后，用只读表格显示结果，用户不能修改数据。提供筛选表格数据功能。
\section{设计1}
\subsection{Models}
\subsubsection {功能设计：显示模型域对象}
显示模型域对象：3种方式：ACAD命令PFA，设计库右键菜单PFA管网流体分析，在CAE导航栏直接点击模型添加或修改。

用户在设计模块中输入命令并选择完管道模型后，切换到流体分析模块并新建一个对象CFD，即Abaqus中的模型；同时将管道模型划分好节点和单元；并在模型节点下自动生成以下必需节点：Material，Assembly，Steps，然后在子节点下自动生成一些节点和数据。用户还可以点击模块，选择流体分析模块，查看之前进行的分析。

在Assembly下自动生成Instance节点，针对之前选择模型的每个分支，在Instance节点新建一个CFDBranch节点，节点中包含对应分支的引用。同时，在生成节点时，将对应分支中int类型的引用参数+1，表示该分支被引用了，数值表示被引用次数，以便之后再次对分支引用时，能从之前进行的设置中取出相应参数，避免用户再度设置。

当用户选择模型时，选择的模型如果在之前已经被引用，则在生成节点时，自动将该模型相同分支的参数设置为之前模型设置的参数，并提醒用户设置不同分支以及一些不再适用的参数。选择模型时，获得分支的引用属性，值大于0时，在流体分析模块中查找相同分支，否则用户设置。相同分支查找参数的方法如下：在流体分析模块的CFDBranch中，查找分支引用为该分支的节点，找到后，根据此节点找到属于该分支的单元或节点，然后根据单元或节点在Step取出step参数（可以将管件与step存放到CMAP中，管件作为KEY）。第二次引用参数赋值的方法：在划分完网格，对参数进行设置时，如果该分支第二次引用，则从之前取出的step参数中查找出属于该管件的参数，出现边界条件设置的单元不同时等待用户设置。

当分支已经被两次引用时之后，再次引用时，将提示用户在前两次引用中选择一个进行加载。如果模型中有多个分支都被多次引用，每个分支都提供选择？

当设计库中的分支被修改时，流体分析模块中引用该分支的模型同时也需要进行修改，其他的节点与单元不变，删除时只删除修改的单元与节点，添加时只在最后添加。

右键新加功能(这个功能给开发者调试程序查看inp文件比较方便，建议使用一个不开放给最终用户的内部命令如debugInp来查看inp文件，不要呈现给最终用户)。

编辑关键字，用户可以查看Inp文件，看那些条件已经设置好了。可以不显示节点和单元。最终用户应该是需要看所有节点单元等全部输出信息，但开发人员可以只看step等，不看节点或单元，以免信息太多干扰调试。

建议尽量使用域对象传递数据，尽量减少查看文本文件。
\subsubsection {功能设计：模型引用域对象}
新建了模型引用域对象RefModel，存储引用的模型等信息。
RefModel主要字段：ID,RefID,RefType

ID是名字，可以象AutoPDMS或AVEVA PDMS常见方法那样，使用两个字段Env\_ID和Element\_ID表示ID。

RefID是引用模型的指针，可以象上面存储ID那样处理，即使用两个字段RefEnv\_ID和RefElement\_ID表示ID。RefType是引用的模型节点类型，模型节点类型如branch,pipe,zone,site,assembly,也可以是BCs,load,parametersets,datasets,element,node,elementset,nodeset等。这样就可以在RefModel存储链表结构，从而实现在一个表查找所有的链接或引用关系。

以引用类型分支为例，查找任何引用类型的流程如下：

首先查找链表头：

从RefModel表找ID=branch ID的记录，如果找到，

如果没找到，查找RefType=branch  AND RefID=当前选择的分支branch ID(实际是Env\_ID和Element\_ID)，如果找到，则引用存在，找

\subsubsection{Material}
仿照AutoPSA实现材料功能，直接调用材料的对话框。

右键点击Material节点，出现菜单栏：添加材料，点击添加材料后弹出AutoPSA的材料对话框，只需要在对话框中添加确认，取消按钮。点击确认后在Material节点下新建一个详细材料节点如material1(建议保存到材料名属性库Propcon-world-matw-SOLI或FLUI节点，同时也保存在AutoPSA材料库)，但是节点名称不能取材料的名字，因为AutoPDMS中节点名称不能名字相同，假如用户不同模型中需要添加相同材料则会冲突。

右键点击详细材料节点如material1节点，出现菜单栏：查看特性。用户可以通过这个查看材料特性或是对数据进行修改。(请描述详细材料节点如何与边界条件中设置的温度联系，显示对应节点下对应温度值的特性)
Material域对象中的属性应该包括各种分析中所需要用到的属性。当属性对温度依赖时，读取保存时可以仿照stressinfo将属性的数据类型设为字符串类型。(此属性温度依赖代码如何通用于管道应力分析和管网流体分析？目前看起来似乎是不能通用，只能单独写。因为PSA材料属性输出到.psa文件里依赖于单元和温度，而PFA输出在inp文件里只依赖温度。不过，还是可以统一的，因为在输出到文件之前还是可以让属性依赖于温度和单元或sections)。
\subsubsection{Assembly}
用户在选择完模型并新建对象CFD时，在CFD下自动生成Assembly节点的同时，在Assembly节点下新建Instances,sets两个节点。在Instances节点下为选择的管道模型每个分支新建一个对象Branch（名称待定）,对象中包含它所对应的分支或设备的引用。branch下新建nodes节点域对象包含划分好的节点信息，新建Elements域对象包含划分好的单元信息。某个分支下的所有节点或单元信息都以stressinfo的形式存放到nodes或elements中的某个字段。

节点和单元的查看可以使用后文所述的查看结果的方式。
\subsubsection{steps}
Steps节点下不同Step代表不同工况，用户进行分析时，首先需要右击Steps，显示菜单栏：新建Step，选择新建后，弹出Step设置框。为了使设置参数及查看结果时能够使用通用的结构，可以使用表格的方式。

设置框中首先是一个下拉框，用来选择要设置的参数类型，如边界条件，荷载，曼宁系数，datasets,nodes,elements等；根据选择，表格控件中就会显示不同表头和内容。每一列是要设置的不同参数，每一行则是对应的节点或单元编号、节点集、单元集。

不同的设置选项有一些细微的差别：

设置边界条件时，三个参数温度，压力，流量中要求只能设置其中任意两个。可以在表格中设置两列，表头为下拉框，选项为三个参数。(暂时不要实现这个功能，因为现在没有完全学会ccx，怕误解需求导致重写这些代码。)

设置载荷时，要设置的节点或单元编号不是划分网格时就确认了的，要求能添加或删除数据行。(现在AutoPDMS管道应力分析设置参数已经实现了添加或删除节点，但没有使用表格显示数据。)

查看结果时，不允许编辑结果。

需要实现的表格基本功能有：编辑，筛选，查找，删除，排序，复制，粘贴，替换。暂时不要实现分页，但是打印时需要实现分页。取消隐藏列，冻结/取消冻结列。

step中设置的所有参数可以组合存放到一个长字符串中，存入到step域对象的某个属性中。读取时解析字符串，放入内存域对象。字符串的储存顺序如下所示：[1,TP(),PR()..][2,TP(),PR()..]。使用[]分隔不同节点或单元的数据，[]中存放节点的属性，首先是编号，然后是属性关键字加小括号()，属性的详细信息存放到()中，还可以加个设置类型字段。

同样可以在表格控件设置输出请求，不过需要使用下拉框。也可以在单独的对话框设置输出请求。
\subsection{Analysis}
\subsubsection{jobs}
在Analysis节点下新建Jobs节点，当用户想要进行分析时，在Jobs节点下右键选择新建Job，弹出Job设置对话框，用户可以在此处选择Steps中设置的Step。选择后，通过对Job节点右键选择计算即可将本次Job中的所有设置写入到inp文件中，并将文件传递给CCX进行计算。

\subsection{Datasets}
把dataset域对象节点放在CAE页面与Model同级，这样也许更便于展示计算结果，计算后只要选择dataset,就可以查看结果。与参数设置类似，同样使用表格控件显示结果，但不允许编辑结果，可以选择隐藏列。需要根据之前设置的输出要求控制显示的列。
\begin{figure}
	\includegraphics[scale=0.5]{ZZNew1.png}
	\caption{导航栏}
\end{figure}

\begin{figure}
	\includegraphics[scale=0.5]{ZZNew2.png}
	\caption{表格对话框}
\end{figure}

\section{CAE表格设计1}
\subsection{表格设计概述}
 构建一个通用的CAE表格，用户点击OutPut、BCs、Load、DataSet等时弹出实例化表格，表头根据类型进行初始化，有些表头并具备下拉功能，用户通过下拉
 选项进行相应的数据类型设置，并可以对设置进行修改，同时对表格增加切换功能，用户可以自由切换到不同的类型设置中进行操作。
 总体结构如下图所示：
 \begin{figure}
 	\includegraphics[scale=0.5]{OriginDesign.png}
 	\caption{CAE总体框架设计}
 \end{figure}
其中，表格设计如下图：
 \begin{figure}
 	\includegraphics[scale=0.4]{TableDesign.png}
 	\caption{CAE表格设计}
 \end{figure}
\subsection{使用方案}
双击Output、BCs、Load或者DataSet等节点后弹出该节点实例化表格。
\subsection{功能设计}
双击上面的任意一个节点，弹出的表格都对应一个相应的域对象。

双击OutPut节点或者在之前打开的表格中切换到，弹出Output表，有4表头：勾选、输出对象、输出选项、选项描述。

其中下拉表头：输出对象、输出选项，一般表头：勾选、选项描述。其中选项描述关联输出选项，并且输出描述是不可修改的。
\begin{figure}
	\includegraphics[scale=0.5]{OutPutRequestTable.png}
	\caption{输出请求表格}
\end{figure}

双击BCs节点或者在之前打开的表格中切换到，弹出BCs，下拉表头有：对象、边界类型；数据设置是一般的表头：温度、压力、质量流量，每次选择一个对象时将会新增一个行，用户进行相应的设置即可，数据设置只需要填写2个即可，这里并不需要做锁定功能，而是依赖于用户。
\begin{figure}
	\includegraphics[scale=0.5]{BoundaryTable.png}
	\caption{边界条件表格}
\end{figure}

双击Load或者在之前打开的表格中切换，弹出Load表，Load下拉表头有：对象(单元名称)、Load类型；数据设置也是一般表头：重力、法向，每次选择一个对象。

同样的会新增一行，在这里，Load设置可能因为Load类型导致数据设置差异很大，这种情况下
\begin{figure}
	\includegraphics[scale=0.5]{LoadTable.png}
	\caption{荷载表格}
\end{figure}

双击DataSet节点或者在之前打开的表格中切换，弹出DataSet表，它是一个只读的DataSet表格，该表格的表头没有下拉，必须要的表头为:模型名称、step名称、节点号；可选表头根据输出请求关键字设置相应的表头，比如温度、位移、压力、质量流量等。
\begin{figure}
	\includegraphics[scale=0.5]{DataSetTable.png}
	\caption{DataSet表格}
\end{figure}

其他表，比如曼宁系数表、阀门开度表，其中曼宁系数表示系统自己给出的数据表，用户可以选择某一个曼宁系数及其对象，也可以新增曼宁系数，但是不可修改。

软件原有的曼宁系数；阀门开度表，下拉表头有一个：阀门对象；数据设置为一般表头：开度大小(0.125~1)

OutPut表、BCs表、Load表等是一个可修改的表，只有DataSet表是一个只读表，并且所有的表应该具备筛选、排序功能。
\section{装配设计-模型包含}
除了前章节对模型装配的设计外，如果用户导出一个新的模型后，这个新的模型与它的最接近的前一个模型存在一个公共的部分，那么这个公共部分的流体设置(集中为边界条件设置)将被在这个新的模型中引用或者部分修改，这个修改并不影响前面的模型。具体来说，当新模型中部分模型包含前一个模型中国的一个部分或整体，新模型需要处理的事物是：
1.新增一个模型后，系统应当判定是否有部分模型在前一个模型中，同时这个部分模型在前一个模型中参与了流体设置，如果有，提示用户是否引用该部分模型的设置
2.用户在新模型中重新设置该部分模型不修改前一个模型的部分设置

\section{CAE表格设计2}
\begin{figure}
	\includegraphics[scale=0.5]{CAETable.png}
	\caption{表格}
\end{figure}

\subsection{Assembly设计}
1.引用设计库中选中的模型,到CAE模块的Assembly下面，有PIPE，Brach分支。
2.如果用户又在设计库中选了模型，并且该模型包含上次选中模型，那么Step边界条件可以继承上个模型的边界条件
\begin{figure}
	\includegraphics[scale=1]{Assembly}
	\caption{Assembly}
\end{figure}


\begin{center}
	
\end{center}
表格的设计

nodes节点表的设计

表头 有节点号，X,Y,Z坐标，管件ID的引用，Tube位于管件的前面还是后面？

单元号 节点集 (多个节点存在一个字段里面) 管件ID的引用 Tube  阀门的开度  摩擦系数 曼宁系数
摩擦系数 曼宁系数(二选一)


parametersets参数表的设计

表头 单元集   类型(如果选择了阀门)  阀门的开度

表头 单元集   类型(如果选择了Tube)  摩擦系数或曼宁系数


BCs表的设计
表头 节点  类型(暂时固定只能选择出口和入口)  流量 温度 压力  (如果已经选择了温度，那么流量与压力，只能二选一)

设置节点的时候，节点用下拉框的显示方式，选中一个节点，新增一行，选中的节点对应的管件高亮。

Dataset表的设计

表头 模型名称 step名称 节点  类型(出口 入口 三通点.荷载点)  压力 温度 流量  以及对应设置输出请求的哪些参数  

关于datasets表头定义，建议使用全部输出字段，这样当输出请求不同但是模型和step及其它参数设置完全相同时，可以存储datasets在同一行记录。显示datasets结果表格时可以使用取消隐藏列或显示列表控制显示哪些列。

有排序 筛选功能

节点和Dataset嵌套在一起
荷载与Bcs嵌套在一起

数据库的存储
多个字段存储

\section{设置和显示设备性能曲线}
可以设置泵、风机、换热器性能曲线。性能曲线用最多9组扬程、流量值存储。可以存储在parameterset参数设置表或设备性能表EquipmentParaSet。

\section{显示属性}
属性窗口用来显示、修改所有节点的所有属性。

可以在属性窗口显示一个或多个节点的属性。

现在AutoPDMS属性窗口只显示一个节点的属性。正在设计CAE模块的属性窗口(或称为表格)显示多个节点的属性。
\subsection {模块总体目标}
可以分类显示及方便修改所有节点所有属性，按节点类型和属性类型修改属性。

可以按属性在不同类型节点出现频率分类为基本属性和节点相关属性。
\subsection {基本属性}
基本属性（所有节点都有的属性，和节点类型无关）：ID、名称(Name)、父节点(Owner)、类型(Type)、加锁(Lock)、颜色、描述(Description)、建造(Built)、购买(Shop)。
\subsection {节点相关属性}
节点相关属性只存在于某些类型节点或某一类型节点。
\subsubsection {管件几何属件}
管道、HVAC、Cabletray、Equipment等模块的管件，具有管件几何属件。例如外径、内径、长度、阀门开度等。
\subsubsection {管件固体物理属件}
管件固体物理属性如密度、质量、重量、温度、应力、应变等，用于仿真分析或统计。
\subsubsection {管件约束属件}
管件约束属性如支吊架、荷载、附加位移、冷紧等，用于仿真分析。
\subsubsection {管件流体属件}
管件流体属性如流体密度、粘度、比热、温度、压力等，用于仿真分析。
\subsubsection {管件流体固体耦合作用属件}
管件流体固体耦合作用属性如曼宁系数、管壁粗糙度、管壁摩擦系数等，用于仿真分析。
\subsubsection {管件属件显示列表}
现在管件属性的显示列表控制规则如下，显示列表现在由哪里控制？

法兰、垫片、堵头、阀门：显示直径、小类型、shop、描述。

大小头：显示两端直径（pbore0、1）、小类型、shop、描述。

\subsection {使用方案：点击导航栏中的节点，右键显示属性-当前节点}
\subsection {功能需求: 显示当前节点的所有属性}
方便用户选择确定自己需要的型号。
\subsection {功能设计: 显示所有属性}
显示属性的函数代码在
h:\textbackslash vc\textbackslash AutoPDMS9.0\textbackslash CommonModule\textbackslash APModuleShare\textbackslash src\textbackslash dlgattributeeditor.cpp。

BOOL DlgAttributeEditor::ShowAtrribute( const UePersistentList\& mUePersistList )			//zengck 2013.01.29  适用多选  UeNodeObject* pObj 
\{

if( mUePersistList.IsEmpty() )		//zengck   pObj == NULL 

return FALSE;

//判断是否锁定当前节点

if( m\_ctrlLockNode.GetCheck() !=0 )

m\_bLockActiveNode = TRUE;

return ShowPersistAtt( mUePersistList );			//zengck  pObj
\}
\subsubsection {ShowPersistAtt}
//显示属性
BOOL DlgAttributeEditor::ShowPersistAtt( const UePersistentList\& mUePersistList )				//zengck   Persistent* pObj 
\{

if( mUePersistList.IsEmpty() )		//zengck   pObj == NULL 

return FALSE;

//m\_pPersist = pObj;		//zengck
m\_UePersistList.RemoveAll() ;

POSITION pos = mUePersistList.GetHeadPosition() ;		//zengck 添加循环

while ( pos )
\{

Persistent* pPersist = mUePersistList.GetNext( pos ) ;

if ( pPersist->IsDelete() )

continue ;

m\_UePersistList.AddTail( pPersist ) ;
\}

if ( m\_UePersistList.IsEmpty() )		//zengck 添加
\{

return FALSE ;
\}

//清空列表
m\_mapIndexToAttName.RemoveAll();

m\_mapModifiedAtt.RemoveAll();

//	m\_AttList.DeleteAllItems();			//zengck 注释

m\_PropertyGrid.ResetContents() ;	//移除之前属性信息

m\_mapIndexToAttName.RemoveAll();

//////////////////////////////////////////////////////////////////////////
Persistent* pPersist = m\_UePersistList.GetHead() ;			//zengck

ClassMapper* pMap = MapperConfigManageDB::GetInstance()->GetClassMapperByNodeType( pPersist->GetRegisterInfo()->GetKey() );//zengck m\_pPersist

ASSERT( pMap );

UEMap<CString,CString,HSECTION,HSECTION> mAttrHsMap; //所有属性的层次类型

//HSECTION hs = m\_PropertyGrid.AddSection("Basic Items");		//zengck 添加

int itemIndex = 0;

ClassMapper::SortAttIteratorPtr pIt = pMap->SortingAttIterator();

for( pIt->Begin(); !pIt->IsEnd(); pIt->Next() )
\{

//显示属性名称默认和注册属性名称一样

CString strAttCNName = \_T( "" ) ;

CString strAttName = \_T( "" );

CString strAttValue = \_T( "" );

BOOL bIsShow = TRUE;		//默认显示属性

BOOL bIsReadOnly = TRUE;	//属性默认为可修改

CString strAttComment = \_T( "" );		//属性注释说明

Persistent* pPersistTmp = NULL;

AttributeMapper* pAttMapper = pIt->Get();

if( pAttMapper != NULL )
\{

strAttName = pAttMapper->GetAttributeName();

bIsShow = pAttMapper->IsShow();

bIsReadOnly = pAttMapper->IsReadOnly();

if( !pAttMapper->GetChnName().IsEmpty() )
\{

strAttCNName = pAttMapper->GetChnName();
\}

else
\{

strAttCNName = strAttName;
\}

//strAttComment = pAttMapper->GetComment();		//zengck

GetCommentByAttName( m\_UePersistList, strAttName, strAttComment ) ;
\}
else
\{

continue;//在配置中没有配置的属性不显示
\}

CString strHierName = pAttMapper->GetAttrHierarchyName(); //属性的大类型

if ( !IsExistSameAttName( m\_UePersistList, strHierName,strAttName, strAttCNName ) )
\{

continue ;
\}

UETypePtr pType = NULL;

CString strAttType = \_T( "" );


HSECTION hs = NULL;
//得到属性所属的大类型

if ( !mAttrHsMap.Lookup( strHierName,hs ) )
\{

hs = m\_PropertyGrid.AddSection( strHierName );

mAttrHsMap.SetAt( strHierName,hs );
\}

pType = pPersist->get\_Value( strAttName );

strAttType = pType->GetType();

if( strAttType.Find( \_T( "AcGePoint3d" ) ) != -1 )
\{

AcGePoint3d ptPoint = uetype\_cast< AcGePoint3d >( pPersist->get\_Value( strAttName ) );

CString strPosX = \_T("") ;

CString strPosY = \_T("") ;

CString strPosZ = \_T("") ;

GetPosXYZByAttNameFromList( m\_UePersistList, strAttName, strPosX, strPosY, strPosZ ) ;			//zengck

// 			itemIndex = m\_AttList.InsertItem( 0Xffff,strAttCNName );		//zengck 注释
// 			m\_AttList.SetItem( itemIndex,1,1,strAttValue,NULL,1,1,0 );
// 			m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 			m\_AttList.SetReadOnly( itemIndex + 1,2 );
// 			m\_AttList.SetItemData( itemIndex,DWORD( 0 ) );

CString strTmpName;

strTmpName.Format( \_T("\%s    X"),strAttCNName ); //AddStringItem不能增加重复的名字，所以加上strAttCNName,分支头尾坐标都显示

itemIndex = m\_PropertyGrid.AddStringItem(hs, strTmpName, strPosX, !bIsReadOnly);

m\_PropertyGrid.SetItemData( itemIndex, DWORD( 1 ) ) ;

// 			itemIndex = m\_AttList.InsertItem( 0Xffff,\_T( "       X" ) );
// 			//strAttValue.Format( \_T( "\%g" ),ptPoint.x );		//zengck
// 			m\_AttList.SetItem( itemIndex,1,1,strPosX,NULL,1,1,0 );		//zengck  strAttValue
// 			m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 			m\_AttList.SetReadOnly( itemIndex + 1,2,bIsReadOnly  );
// 			m\_AttList.SetItemData( itemIndex,DWORD( 1 ) );

m\_mapIndexToAttName.SetAt( itemIndex,strAttName );

strTmpName.Format( \_T("\%s    Y"),strAttCNName ); //AddStringItem不能增加重复的名字，所以加上strAttCNName

itemIndex = m\_PropertyGrid.AddStringItem(hs, strTmpName, strPosY, !bIsReadOnly );

m\_PropertyGrid.SetItemData( itemIndex, DWORD( 2 ) ) ;

// 			itemIndex = m\_AttList.InsertItem( 0Xffff,\_T( "       Y" ) );
// 			//strAttValue.Format( \_T( "\%g" ),ptPoint.y );			//zengck
// 			m\_AttList.SetItem( itemIndex,1,1,strPosY,NULL,1,1,0 );			//zengck  strAttValue
// 			m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 			m\_AttList.SetReadOnly( itemIndex + 1,2,bIsReadOnly  );
// 			m\_AttList.SetItemData( itemIndex,DWORD( 2 ) );

m\_mapIndexToAttName.SetAt( itemIndex,strAttName );

strTmpName.Format( \_T("\%s    Z"),strAttCNName ); //AddStringItem不能增加重复的名字，所以加上strAttCNName

itemIndex = m\_PropertyGrid.AddStringItem(hs, strTmpName, strPosZ, !bIsReadOnly );

m\_PropertyGrid.SetItemData( itemIndex, DWORD( 3 ) ) ;

// 			itemIndex = m\_AttList.InsertItem( 0Xffff,\_T( "       Z" ) );
// 			//strAttValue.Format( \_T( "\%g" ),ptPoint.z );		//zengck  
// 			m\_AttList.SetItem( itemIndex,1,1,strPosZ,NULL,1,1,0 );			//zengck strAttValue
// 			m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 			m\_AttList.SetReadOnly( itemIndex + 1,2,bIsReadOnly  );
// 			m\_AttList.SetItemData( itemIndex,DWORD( 3 ) );

m\_mapIndexToAttName.SetAt( itemIndex,strAttName );

continue;
\}
else if( strAttType.Find( \_T( "UeOrientation" ) ) != -1 )
\{

UeOrientation ort = uetype\_cast< UeOrientation >( pPersist->get\_Value( strAttName ) );

// 			itemIndex = m\_AttList.InsertItem( 0Xffff,strAttCNName );
// 			m\_AttList.SetItem( itemIndex,1,1,strAttValue,NULL,1,1,0 );
// 			m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 			m\_AttList.SetReadOnly( itemIndex + 1,2 );
// 			m\_AttList.SetItemData( itemIndex,DWORD( 0 ) );

CString strDirY = \_T("") ;

CString strDirZ = \_T("") ;

if ( GetDirYZByOrientation( m\_UePersistList, strAttName, strDirY, strDirZ ) )
\{

itemIndex = m\_PropertyGrid.AddStringItem(hs, \_T("    Y IS"), strDirY, !bIsReadOnly );

m\_PropertyGrid.SetItemData( itemIndex, DWORD( 1 ) ) ;

// 				itemIndex = m\_AttList.InsertItem( 0Xffff,\_T( "    Y IS" ) );
// 				m\_AttList.SetItem( itemIndex,1,1,strDirY,NULL,1,1,0 );
// 				m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 				m\_AttList.SetReadOnly( itemIndex + 1,2,bIsReadOnly  );
// 				m\_AttList.SetItemData( itemIndex,DWORD( 1 ) );

m\_mapIndexToAttName.SetAt( itemIndex,strAttName );

itemIndex = m\_PropertyGrid.AddStringItem(hs, \_T("    Z IS"), strDirZ, !bIsReadOnly );

m\_PropertyGrid.SetItemData( itemIndex, DWORD( 2 ) ) ;

// 				itemIndex = m\_AttList.InsertItem( 0Xffff,\_T( "    Z IS" ) );
// 				m\_AttList.SetItem( itemIndex,1,1,strDirZ,NULL,1,1,0 );
// 				m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 				m\_AttList.SetReadOnly( itemIndex + 1,2,bIsReadOnly  );
// 				m\_AttList.SetItemData( itemIndex,DWORD( 2 ) );

m\_mapIndexToAttName.SetAt( itemIndex,strAttName );
\}

continue;
\}

CString strArrValue = \_T( "" );

if ( !GetAttributeValueByPersistList( m\_UePersistList, strAttName, strAttValue, strArrValue ) )
\{

continue ;
\}

itemIndex = m\_PropertyGrid.AddStringItem(hs, strAttCNName, strAttValue, !bIsReadOnly );
m\_PropertyGrid.SetItemData( itemIndex, DWORD( 0 ) ) ;

// 		itemIndex = m\_AttList.InsertItem( 0Xffff,strAttCNName );
// 		m\_AttList.SetItem( itemIndex,1,1,strAttValue,NULL,1,1,0 );
// 		m\_AttList.SetItem( itemIndex,2,1,strAttComment,NULL,1,1,0 );
// 		m\_AttList.SetReadOnly( itemIndex + 1,2,bIsReadOnly );
// 		m\_AttList.SetItemData( itemIndex,DWORD(0) );

m\_mapIndexToAttName.SetAt( itemIndex,strAttName );

int nPos = -1;

nPos = strArrValue.Find( \_T( "\$" ) );

int nArrIndex = 1;

while( nPos > 0 )
\{

CString strShowValue = strArrValue.Left( nPos );

strArrValue = strArrValue.Mid( nPos + 1 );

nPos = strArrValue.Find( \_T( "\$" ) );

CString strShowNum( \_T( "" ) );

strShowNum.Format( \_T( "\%d" ),nArrIndex );

itemIndex = m\_PropertyGrid.AddStringItem(hs, \_T("       ") + strShowNum, strShowValue, !bIsReadOnly );

m\_PropertyGrid.SetItemData( itemIndex, DWORD( nArrIndex ) ) ;

// 			itemIndex = m\_AttList.InsertItem( 0Xffff,\_T( "       " ) + strShowNum );
// 			m\_AttList.SetItem( itemIndex,1,1,strShowValue,NULL,LVCFMT\_RIGHT,1,0 );
// 			m\_AttList.SetReadOnly( itemIndex + 1,2,bIsReadOnly );
// 			m\_AttList.SetItemData( itemIndex,DWORD( nArrIndex ) );

nArrIndex++;

m\_mapIndexToAttName.SetAt( itemIndex,strAttName );
\}	
\}

//////////////////////////////////////////////////////////////////////////
//	m\_PropertyGrid.SetDisplayMode(CPropertyGrid::DM\_CATEGORIZED);

return TRUE;
\}

\subsubsection{GetAttributeValueByPersist}
//zengck 

//通过属性名+节点得到属性值

BOOL DlgAttributeEditor::GetAttributeValueByPersist( Persistent* pPersist, const CString\& strAttName,
CString\& strAttValue, CString\& strArrValue )
\{
\}
\subsection{用表格显示多个节点的属性}
使用表格显示多个节点的属性，可以看到更多数据，比较直观。表格后台需要函数CAllSettingEditListCtrl::InsertAItem提供多个节点的属性，该函数代码在文件
h:\textbackslash vc\textbackslash AutoPDMS9.0\textbackslash CommonModule\textbackslash APModuleShare\textbackslash src\textbackslash AllSettingEditListCtrl.cpp。
\subsubsection {AddNode}
//外部接口，给列表提供要在列表里显示属性的节点 Add By lucz: ue5 时间:08.12.15

//此为第一种方式，即每一行只显示一个节点信息

void CAllSettingEditListCtrl::AddNode( UeNodeObject* pNode )
\{

int nItem = GetItemCount();

if ( pNode == NULL )
\{

AfxMessageBox( \_T("对象是空的") );

return;
\}

std::vector<CString>::iterator it = m\_vectType.begin();

if ( nItem > 0 \&\& it != m\_vectType.end() )
\{

CString strType = static\_cast<CString>(*it);

if ( strType.Find( pNode->GetType() ) == -1 )
\{

AfxMessageBox( \_T("对象类型匹配失败") );

return;
\}
\}

if ( nItem == 0 \&\& m\_vectType.size() == 0 )//以这种方式添加到列表的话只需添加第一次的节点类型保存，用于类型合法检查

\{

m\_vectType.push\_back( pNode->GetType() );//只需要添加第一个对象时保存
\}

//将该对象节点将在列表里显示的一些信息保存在结构体里，并将该结构体添加到哈西表里

ObjectLocation objLoc;

objLoc.iRow = nItem;

objLoc.iCol = 0;

objLoc.pNode = pNode;

objLoc.nColNum = SetData( nItem, 0, pNode );//在报表的指定行上某列开始显示节点属性信息

m\_vtrObject.push\_back(objLoc);
\}
\subsubsection {InsertAItem}
//插入新数据////////////////////////////////////////////////Add By lucz: ue5 时间:08.12.15

//同上，此为第二种方式，即一行显示多节点信息

int CAllSettingEditListCtrl::InsertAItem( int nItem, std::vector<UeNodeObject*> vectObj )
\{

if( vectObj.size() == 0 )
\{

return -1;
\}

if ( m\_vtrObject.empty() )
\{

int i = 0;

if ( m\_vectType.size() == 0 )
\{

for ( i = 0; i < vectObj.size(); i ++ )
\{

m\_vectType[i] = vectObj[i]->GetType();//循环保存行对象类型
\}
\}

Add(nItem, vectObj);//初始化新结构体对象系列，并显示应该显示的属性

return 0;
\}

else if( CheckNodes(vectObj) )
\{

int nItemTemp = m\_vtrObject.size();

if ( nItem >= nItemTemp || nItem == -1 )
\{

nItem = nItemTemp;

Add(nItem, vectObj);//添加到结构体，并显示应该显示的属性
\}

return nItem;

\}
else
\{

MessageBox( \_T("对象类型错误，添加失败") );
\}

return -1;
\}
\subsubsection {Add}
//添加到结构体，并显示应该显示的属性

void CAllSettingEditListCtrl::Add(int nItem, std::vector<UeNodeObject*> vectObj)
\{

int iColFst = 0;

int i = 0;

ObjectLocation objLocFisrt;

ObjectLocation* pObjLocPrev = \&objLocFisrt;

for ( ; i < vectObj.size(); i++ )
\{	

ObjectLocation* pObjLocNext = new ObjectLocation;

if ( i != vectObj.size() -1 )
\{	

pObjLocPrev->next = pObjLocNext;
\}

pObjLocPrev->iRow = nItem;

pObjLocPrev->iCol = iColFst;

UeNodeObject* pNodeObj = static\_cast<UeNodeObject*>( vectObj[i] );

UEASSERT( pNodeObj , \_T("yun") );

if ( pNodeObj )
\{

pObjLocPrev->pNode = pNodeObj;

pObjLocPrev->nColNum = SetData( nItem, iColFst, pNodeObj );//在报表的指定行上某列开始显示节点属性信息

iColFst = iColFst + pObjLocPrev->nColNum;

pObjLocPrev = pObjLocNext;
\}	

\}

m\_vtrObject.push\_back(objLocFisrt);
\}
\subsubsection {InsertCols}
void CAllSettingEditListCtrl::InsertCols()
\{

CString strModuleName = GetModuleName();

if ( !strModuleName.IsEmpty() )
\{

//InsertColumn( 0, \_T("ID"), LVCFMT\_LEFT, 0 );

UeNodeObject* pNode = NULL;

Vect\_ObjLocation::iterator it = m\_vtrObject.begin();

int nRow = 0;

for( ; it != m\_vtrObject.end(); it++, nRow++ )
\{

ObjectLocation* objLo = static\_cast<ObjectLocation*>(\&*it);

int nCol = 0;

do 
\{

objLo->iRow = nRow;//在位置对象中保存对象行

objLo->iCol = nCol;//在位置对象中保存对象列

pNode = objLo->pNode;

objLo->nColNum = SetData( nRow, nCol, pNode );//在报表的指定行上某列开始显示节点属性信息

nCol = nCol + objLo->nColNum;//设置下一个位置对象的起始列

objLo = objLo->next;

\} while ( objLo );		

\}//for
\}//if ( !strType.IsEmpty() )

\}
\subsubsection {InitHeader}
//////////////////////////////////////////////////////////////////////////
//初始化列头，当列表为空时也要显示相应的列头
void CAllSettingEditListCtrl::InitHeader( CString strNodeType, CString strModuleName, int iBaseCol /*= 0*/ )
\{
if ( strModuleName.IsEmpty() )
\{
MessageBox( \_T("模块名空！") );
return;
\}

SetModuleName(strModuleName);
MapperConfigManageDB::AttMapperList* pMapList = NULL;
pMapList = MapperConfigManageDB::GetInstance()->GetAttMapperListByNodeTypeAndModuleType(  strNodeType, GetModuleName() );
if ( pMapList )
\{
MapperConfigManageDB::AttMapperList::iterator listIt = pMapList->begin();
int iCol = iBaseCol;
for( ; listIt != pMapList->end(); listIt++, iCol++ )
\{
//显示属性名称默认和注册属性名称一样
CString strAttCNName = \_T( "" ) ;
CString strAttName = \_T( "" );
CString strAttValue = \_T( "" );
BOOL bIsShow = TRUE;		//默认显示属性
BOOL bIsReadOnly = TRUE;	//属性默认为可修改
CString strAttComment = \_T( "" );		//属性注释说明

Persistent* pPersistTmp = NULL;

AttributeMapper* pAttMapper = *listIt;

if( pAttMapper != NULL )
\{
strAttName = pAttMapper->GetAttributeName();
bIsShow = pAttMapper->IsShow();
bIsReadOnly = pAttMapper->IsReadOnly();
if( !pAttMapper->GetChnName().IsEmpty() )
\{
strAttCNName = pAttMapper->GetChnName();
\}
else
\{
strAttCNName = strAttName;
\}
strAttComment = pAttMapper->GetComment();
\}
else
\{
continue;//在配置中没有配置的属性不显示
\}
int iCol = -1;
if ( !FindColumnIndex(strAttCNName,iCol,iBaseCol) \&\& iCol != -1 )
\{
InsertColumn( iCol, strAttCNName,LVCFMT\_LEFT, 2*GetStringWidth(strAttCNName) );
m\_mapIndexToAttName.SetAt( iCol, strAttName );
\}
SetReadOnly( 0, iCol+1, bIsReadOnly );
\}
\}
\}
\subsubsection{SetData}
//在报表的指定行上显示节点属性信息,返回对象在报表中存放的宽度

这个函数有328行，为节省篇幅，不列出它。

int CAllSettingEditListCtrl::SetData( int iRow, int iBaseCol, UeNodeObject* pNode )
\subsubsection{GetAttributeMapper}
//根据属性名和持久对象得到属性信息

AttributeMapper* CAllSettingEditListCtrl::GetAttributeMapper( const CString\& strAttName,Persistent* pObj )
\{

AttributeMapper* pAttMapper = NULL;

ASSERT( pObj );

if( NULL != pObj )
\{

ClassMapper* pMapper = MapperConfigManageDB::GetInstance()
->GetClassMapperByNodeType( pObj->GetRegisterInfo()->GetKey() );

if( NULL != pMapper )
\{

pAttMapper = pMapper->GetAttributeMap( strAttName );
\}
\}

return pAttMapper;	
\}
\section{其他的需求}
\section{有待解决的问题列表}
\section{附录}
无。

\section{CAE 功能评估表}


\begin{thebibliography}{99}
\bibitem{zhuyiwencyq} 朱,以文, and 蔡,元奇等. (译), \textit{abaqus从入门到精通}.,武汉大学建筑学院, 湖北,(2003).
\bibitem{ligb} 李,国斌, and 等. (译), \textit{PDMS PROPCON 属性库参考手册11.6版中文版}.,长沙优易软件开发有限公司, 湖南,(2018).
	
	
	\end{thebibliography}

%\end{multicols}


\end{document}